ファイル名一括変換君

小遣い稼ぎか知らんが、こういう初歩的なものに何百円も何千円も要求出来ると思っている輩がいること自体、Unix 育ちには信じられんのであるが、どういうわけか、本当に「ファイル名一括置換ツール」を検索してしまう「自称ソフトウェアエンジニア」は後を絶たない。なんでぢゃ。

一般人なら別になんとも思わないよ。自分で作る必要なんかないしさ。けどな、だとしてもこんなもんに金払うのは、やっぱ馬鹿だよ。

DOS の ren ではどうにもならなくなるような、このような迷惑な自動命名があるとする:

 1 me@host: Dropbox$ ls *.png | sort
 2 スクリーンショット 2015-04-29 23.27.36.png
 3 スクリーンショット 2015-04-29 23.29.04.png
 4 スクリーンショット 2015-04-29 23.33.57.png
 5 スクリーンショット 2015-04-29 23.37.15.png
 6 スクリーンショット 2015-04-29 23.39.48.png
 7 スクリーンショット 2015-04-30 01.55.07.png
 8 スクリーンショット 2015-04-30 03.46.11.png
 9 スクリーンショット 2015-04-30 06.19.10.png
10 スクリーンショット 2015-04-30 06.19.45.png
11 スクリーンショット 2015-04-30 06.48.01.png

日本語を含んでいるのが既にイヤらしいが、なんでわざわざ空白入れるんだか、ということ。そしてこれを、この順に「シンプルな連番」のファイル名に一括置換したい。よくあるだろう、これ。

このサイトは Python ネタが多いけれど、ワタシはこの種のタスクに Python を使うことはまずなくて、awk でやっちゃいます、大抵。まず、変換前に、シェルに喰わせる入力だけ作る:

 1 me@host: Dropbox$ ls *.png | sort | awk '{printf("mv -fv '"'"'%s'"'"' %03d.png\n", $0, NR)}'
 2 mv -fv 'スクリーンショット 2015-04-29 23.27.36.png' 001.png
 3 mv -fv 'スクリーンショット 2015-04-29 23.29.04.png' 002.png
 4 mv -fv 'スクリーンショット 2015-04-29 23.33.57.png' 003.png
 5 mv -fv 'スクリーンショット 2015-04-29 23.37.15.png' 004.png
 6 mv -fv 'スクリーンショット 2015-04-29 23.39.48.png' 005.png
 7 mv -fv 'スクリーンショット 2015-04-30 01.55.07.png' 006.png
 8 mv -fv 'スクリーンショット 2015-04-30 03.46.11.png' 007.png
 9 mv -fv 'スクリーンショット 2015-04-30 06.19.10.png' 008.png
10 mv -fv 'スクリーンショット 2015-04-30 06.19.45.png' 009.png
11 mv -fv 'スクリーンショット 2015-04-30 06.48.01.png' 010.png

引用符何個いるのよ、てのだけが、唯一「ウザイ」とこだけどね。(bourne-shell 系のシェルでは、引用符の規則は実はかえって簡単です。'"'"' をみるとビビるかもしれないけど、これ、一番左の単一引用符は単に「閉じている」だけ、"'"が、一重引用符を二重引用符で囲んでいるだけ、一番右の単一引用符は「再び引用開始している」だけ、です。)

後はパイプするだけ:

 1 me@host: Dropbox$ ls *.png | sort | awk '{printf("mv -fv '"'"'%s'"'"' %03d.png\n", $0, NR)}' | sh
 2 `スクリーンショット 2015-04-29 23.27.36.png' -> `001.png'
 3 `スクリーンショット 2015-04-29 23.29.04.png' -> `002.png'
 4 `スクリーンショット 2015-04-29 23.33.57.png' -> `003.png'
 5 `スクリーンショット 2015-04-29 23.37.15.png' -> `004.png'
 6 `スクリーンショット 2015-04-29 23.39.48.png' -> `005.png'
 7 `スクリーンショット 2015-04-30 01.55.07.png' -> `006.png'
 8 `スクリーンショット 2015-04-30 03.46.11.png' -> `007.png'
 9 `スクリーンショット 2015-04-30 06.19.10.png' -> `008.png'
10 `スクリーンショット 2015-04-30 06.19.45.png' -> `009.png'
11 `スクリーンショット 2015-04-30 06.48.01.png' -> `010.png'
1 me@host: Dropbox$ ls *.png
2 001.png  002.png  003.png  004.png  005.png  006.png  007.png  008.png  009.png  010.png

毎度必要になるたびにソラでこれを打ち込んでしまうので、ワタシはこれをツールに仕立て上げようと思ったことはないのだけれども、まぁやろうと思えば出来るよね。ほぼ上記のまんまシェルスクリプトにするのも簡単だろうし、python とかなら、もちっと柔軟で親切なものが作れるかね。