ファイルリネーマを書いた。引数に置換パターン、置換後文字列、ファイル名を渡すと、ファイル名を置換してくれる。正規表現は、インストールしている sed がサポートするものとなる。
#!/bin/sh if [ $# -gt 1 ]; then Pattern=$1 shift; for file in "$@" do if [ -f "$file" ]; then orgname=$( basename "$file" ); dir=$( dirname "$file" ); newname=$( echo -n "$orgname" | sed -e "$Pattern" ); if [ "$dir/$orgname" != "$dir/$newname" ]; then echo "$dir/$orgname -> $dir/$newname" mv "$dir/$orgname" "$dir/$newname" fi fi done else cat <<EOF Usage: $0 Pattern File [ Files ... ] EOF fi
以下のように実行する。
# music ディレクトリ配下にあるファイル名を一括変換 $ ./rern 's/^(dummy) *//g' ./music/* ./(dummy) test.mp3 -> ./test.mp3
sed で新しいファイル名を生成し、オリジナルと比べてみてから mv しているが、ディレクトリ指定などの機能(つまり、スクリプト内でファイル名リストを生成して、それを使う)を追加するとすれば、find か何かで正規表現検索をかけ、マッチしたものだけをリネームしてやる方が効率的だと思う。
と、ここまで書いて、車輪の再発明臭がぷんぷんしていたので、恐る恐るぐぐったら、やっぱりあった。
ファイル名を一括変更するには(renameコマンド) – Ubuntu Japanese Wiki
というか、rename コマンドで正規表現使えた。man ページを見てみても以下のような記述しかなかった(sed ライクな置換方法には触れていない)ので、すっかり騙された。
書式
rename from to file…
説明
rename は、指定したファイル名において from に最初にマッチする部分を to で置き換える。
例えば、ファイル foo1, …, foo9, foo10, …, foo278 を与えると、
rename foo foo0 foo?
rename foo foo0 foo??
というコマンドは、ファイル名を foo001, …, foo009, foo010, …, foo278 に変換する。
そして、
rename .htm .html *.htm
というコマンドは、html ファイルの拡張子を修正する。
ページにも記載があるとおり、全ての UNIX 系 OS で使えるワケではなく、一般的な Linux ディストリのみにあるコマンドらしい。
※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。