findとsedを利用した一行野郎のファイル名変換
概要
X系環境で特定文字を含んだ大量ファイルを一気に特定のルールに従ったファイル名変換したいことってよくあります。
ファイル名変換用のスクリプトをperlやphpなんかで組んでそれを特定のディレクトリに流してもいいけど、
シェルスクリプトだけでやる方法を記述しておきます。
(例) : 例えば以下のファイルのように"Test"などの特定文字列を含んだファイルが複数存在し、
PHPTestというファイルだけに変換を加えたい時。"Test"を"Stab"に変更します。
-rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPTestAction.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPTestCode1.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPTestModule.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:20 PerlTestAction.pl -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:20 PerlTestCode1.pl
実行コマンド
確認
find . -name "*PHPTest*" | sed -e 's/\(\(.*\)Test\(.*\)\)/mv \1 \2Stab\3/g'
実行
find . -name "*PHPTest*" | sed -e 's/\(\(.*\)Test\(.*\)\)/mv \1 \2Stab\3/g' | sh
実行結果
"Test" → "Stab"に変換されているのが分かります。
-rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPStabAction.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPStabCode1.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPStabModule.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:20 PerlTestAction.pl -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:20 PerlTestCode1.pl
解説
コマンドの組み合わせとして利用するのは
・find
・sed
・|(パイプ)
の3点です。
構文を書くと次のようになります。
find <ディレクトリ> "<検索文字列>" | sed -e 's/<正規表現>/mv <後方参照><置換文字列><後方参照>/g' | sh
よくはまる箇所というとsedの中の正規表現で後方参照したい文字列を()でくくるときにエスケープするというところでしょうか。
\(後方参照したいパターン\)とすると置換部分で\1 \2などのように参照することができます。
最後の | sh でシェルを実行しますので、最初は外して実行コマンドをprintしてみてください。
問題なければ | sh を付けて、”えいや!”って実行してください。