解決したい課題
Hoge
というディレクトリの中にHoge
という名前のあるテキストが複数存在するケース。
ここで、ディレクトリ名もファイル名もhoge
に置換したい。
置換コマンドの説明
find `pwd` -name "*Hoge*" -print | perl -nle 'rename $_, s|Hoge|hoge|r'
printまで
この時点で、対象のディレクトリとファイルの一覧が出る。
-print0
としないのは、perlで一行ずつ処理させたいから。
% find `pwd` -name "*Hoge*" -print
/Users/omokawayasuaki/test/Hoge
/Users/omokawayasuaki/test/Hoge/Hoge1.txt
/Users/omokawayasuaki/test/Hoge/Hoge3.txt
/Users/omokawayasuaki/test/Hoge/Hoge2.txt
perlの部分
s|Hoge|hoge|r'
のr
は、デフォルト変数$_
を置換し、スカラー値として返却するためのオプション。置換した元の文字列は変更しないのが特徴。
参考
変換前の状態
% tree
.
└── Hoge
├── Hoge1.txt
├── Hoge2.txt
└── Hoge3.txt
変換コマンド2回叩く
% find `pwd` -name "*Hoge*" -print | perl -nle 'rename $_, s|Hoge|hoge|r'
% find `pwd` -name "*Hoge*" -print | perl -nle 'rename $_, s|Hoge|hoge|r'
変換後の状態
% tree
.
└── hoge
├── hoge1.txt
├── hoge2.txt
└── hoge3.txt
以上
さらなる課題
古いディレクトリ名を一回で上書きできないため、コマンドを2回叩くという結果になってしまった。正直、面倒臭い。
もっとスマートな解決策があれば、教えてください