bashで特定の文字列を含むファイルの名前を、一括置換する
bashである文字列を含むファイルについて、一括置換したかった
カレントディレクトリにあるファイルのうち、
無題を含むものをmudaiに変える、みたいなことがしたかった。
結論
解説
まず、以下のようにファイルを準備します。
$ touch hogeA hogeB fugaC
これらのファイルのうち、以下の2つのファイル名を
hogeA -> ho:)geA hogeB -> ho:)geB
と変更することにします。
for文
こう書けば、カレントディレクトリのファイルについて
ループ処理をすることが出来ます。
# run.sh for file in * do echo ${file} done
$ sh run.sh fugaC hogeA hogeB
sed
新しいファイル名を生成する際、正規表現を使うことがあります。
そのときはこのsedを使いましょう。
以下のように使うことが出来ます。
$ echo hogeA | sed -E 's/(ho)(ge)/\1:)\2/g' ho:)geA
-E オプション
正規表現が使えます。
's/(ho)(ge)/\1:)\2/g' について
ho, geという文字をかっこでくくることにより、キャプチャを撮っています。
そして、\1, \2で再度アクセスしてます。
\1, \2の間にhappy simbolをいれてます。
mv
forとsedを組み合わせて、
sedで新しいファイル名を生成しつつ、
mvでその新しいファイル名に変更していきます。
for file in * do after_file=`echo ${file} | sed -E 's/(ho)(ge)/\1:)\2/g'` mv -i "${file}" "${after_file}" done
まとめ
sedコマンド、とても便利。
とくにキャプチャを取り始めるとその便利さに驚く。
今回、xargsなどを用いるともっと簡単にかけるかもしれないが、
可読性のためにココらへんでとどめておくことにした。
またチャレンジしたい。
bashは最強のポータビリティ言語。