ファイルの一括リネーム。皆さん悩ましいですね。
単にリネームだけじゃなくてファイルの移動なども同時に実行となると、なかなか適合するものがありません。 一番しっくりくるのは EmacsのDiredなんですが、それだけのためにEmacsを使うのはちょっと…
(Emacsは10年前に卒業して以来全く触ってません。当時MeadowやNTEmacsにはお世話になりました)
その他、多種多様なツールがありますが、どれも僕の好みではありませんでした。
何か良いのは無いんかい、と思いつつググると、rename
というコンドラインツールは見つかったものの、
それよりも僕に刺さったのが、毎度おなじみStackOverflowのこの投稿。
つまりこういうこと。
素晴らしいですね。なんで思いつかなかったんだろう。バッチ操作のスクリプトをワンライナーで生成してsh
に流せばいいだけ。
というわけで、サクッとこんな風に書いて
find . -name '*.xlsx' -or -name '*.json' \ | perl -pe 's!(.*)/(\d+)\.(\d+)\.(\d+)_([^/]+)$!cp $& ../out/$2_$3_$4_$5!g' \ | perl -pe 's/(.+)-([^-]+)$/$1_$2/g' \ | sh
やりたいことが出来るようになりました。
sh
に流さず一旦テキストファイル化するだけでdry-run*1ですし、
ワンライナーでは難しいような込み入った操作であれば、それを好きに編集してから sh
に流せばいいだけ。
っていうか、これが由緒正しい本来のshの使い方そのものかと。
ちなみに上記の意味を解説しておくと、
- ディレクトリを再帰的にたどり、
1.2.3_あいうえお.xlsx
ないし1.2.3_あいうえお-1.json
というファイルの名前を1_2_3_あいうえお.xlsx
や1_2_3_あいうえお_1.json
に変換して、../out
へコピーせよ
です。
*1:実際には実行せず、何が起きるか確認だけする行為