ファイル名の交換コマンド: mvswap

最近,シェル上でファイル名を交換することが多くなってきた.こんなコマンドをよく打つ.

% mv hoge hoge.tmp
% mv fuga hoge
% mv hoge.tmp fuga

指が疲れるし,誤って操作をする確率も高くなる.


そこでこんなシェルスクリプトを書いて,~/binにぶちこんでおいた.

  • ~/bin/mvswap
#!/bin/sh
# TMPNAME=".tmp-hoge-fuga-piyo" # さすがにこんなファイル名をつけている人いないでしょう
TMPNAME=`mktemp` # 重複のないファイルを/tmp以下に作成.ファイル名を受け取る (2009-12-30追記)

if [ $# -eq 2 ]; then
   mv $1 $TMPNAME
   mv $2 $1
   mv $TMPNAME $2
  • 動作確認
% ls 
a b
% cat a
hoge
% cat b
fuga

% mvswap a b
% cat a
fuga
% cat b
hoge

ちゃんと動いているみたい.


もっとスマートな方法があるのかなぁ?知っている方がいたら教えてください.

2009-12-30追記

mochaさんに頂いたコメントを元にちょっとだけ修正しました.
mktempコマンドを用いて/tmp以下に重複のないファイルを作成し,そのファイル名を中間ファイル名に使用します.
これでより安全にファイル名の交換ができるようになりました.
mochaさんありがとうございます!