君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

bashで特定の文字列を含むファイルの名前を、一括置換する

f:id:karoten512:20180220003702j:plain

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は最強のポータビリティ言語。