正規表現を使ったファイル名一括変換 rename コマンド

ファイルリネーマを書いた。引数に置換パターン、置換後文字列、ファイル名を渡すと、ファイル名を置換してくれる。正規表現は、インストールしている 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/^(ラジオ) *//g' ./music/*
./(ラジオ) 伊集院光 深夜の馬鹿力 #582 (061212).mp3 -> ./伊集院光 深夜の馬鹿力 #582 (061212).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 ディストリのみにあるコマンドらしい。

投稿者:

dyama

システムエンジニアです。佐世保に住んでいます。

コメントを残す

メールアドレスが公開されることはありません。