かすみん日記

暇なときに何か喋ります

mvコマンドでファイル名一括置換

Macにはrenameコマンドが入ってなかったので、mvコマンドをfor文で回す方法で、ファイル名の一括置換を試みる。

練習するときはmvコマンドのかわりにechoコマンドを使えばいいです。

方法

ファイル名の先頭・末尾に文字列を追加

カレントディレクトリにある全てのファイル・ディレクトリに適用;

ls
# aaa.html
# bbb.html
# dir/

for name in *; do mv $f hoge_${name}_geho; done

ls
# hoge_aaa.html_geho
# hoge_bbb.html_geho
# hoge_dir_geho/

ファイルだけに適用するには、ワイルドカード*find . -type fに置き換えればよい;

ls
# aaa.html
# bbb.html
# dir/

for name in `find . -typr f`; do mv $name hoge_${name}_geho; done

ls
# hoge_aaa.html_geho
# hoge_bbb.html_geho
# dir/

ディレクトリにだけ適用したい場合はfind . -type fを使えばよい。

ファイルの拡張子を変更

拡張子.txt.mdに一括置換;

ls
# aaa.html
# bbb.txt
# ccc.txt

for name in *; do mv $name ${name%.txt}.md; done

ls
# aaa.html
# bbb.md
# ccc.md

ファイル名に含まれる文字列を置換

例えば、ファイル名に含まれる1997という文字列を2021に置き換える;

ls
# aaa1997.jpg
# bbb1997.jpg

for name in *; do mv $name ${name/1997/2021}; done

ls
# aaa2021.jpg
# bbb2021.jpg

正規表現を使って指定できるので、より複雑な処理もできます。

補足

findコマンドはその名の通りファイルやディレクトリを検索するコマンドです。

${name}という形のものは、シェルの変数展開というもので、#%/でいろいろな処理をしつつ変数を展開できます。

また、ファイル名の一括変更はmvではなくrenameコマンドを使えばよりシンプルにかけるみたいです。

今回はgit mvしたかったのでシェルのfor文を使った方法で書いてみました。

以上。

参考

ktykwsk.com

www.koikikukan.com

qiita.com