正規表現を使ったファイル名一括変換 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/^(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 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください