ファイル名を途中から採番してリネームするスクリプト
file01.xxx file02.xxx
上のディレクトリに加えたファイルfugafuga.yyyを
file01.xxx
file02.xxx
fugafuga.yyy # 追加
file03.xxxにリネームしたいときに。
file01.xxx
file02.xxx
file03.xxx # リネーム
手順
以下のスクリプトをコマンドラインで実行します。
(リネーム対象ファイルかどうか判定できれば、同じ拡張子でも大丈夫です)
> ruby -r fileutils -e "Dir.glob('*').sort_by {|v| File.mtime(v) }.each_with_index{|f, i| FileUtils.mv(f, \"file#{ sprintf('%02d', i + 1) }.xxx\") if /\Afile\.xxx\z/ !~ f }"
展開するとこうなります。(ブロックチェーンをインデントしてみた)
require "fileutils" # ワイルドカード"*"(アスタリスク)でディレクトリ内の全ファイルを処理 Dir.glob("*").sort_by {|f| # タイムスタンプ順に採番する File.mtime(f) }.each_with_index {|f, i| # リネーム対象ファイルかどうか正規表現で判定(!~はマッチしない場合を真とする演算子) if /\Afile.*\.xxx\z/ !~ f # リネーム対象ファイルの場合、リネームを実行 FileUtils.mv(f, "file#{ sprint('%02d', i + 1) }.xxx") end }
ディレクトリ内に余計なファイルが混じっている場合、Dir.globの引数で排除してください。
(※globは正規表現ではなくワイルドカード方式です。)