Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

findとsedを利用した一行野郎のファイル名変換

概要

X系環境で特定文字を含んだ大量ファイルを一気に特定のルールに従ったファイル名変換したいことってよくあります。
ファイル名変換用のスクリプトperlphpなんかで組んでそれを特定のディレクトリに流してもいいけど、
シェルスクリプトだけでやる方法を記述しておきます。

(例) : 例えば以下のファイルのように"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 を付けて、”えいや!”って実行してください。