状況
次のような名前のファイルが沢山ある。
old-0.png
old-1.png
...
old-187.png
これらを一括で次のようにリネームしたい。
new0001.png
new0002.png
...
new0188.png
方法
最終的にリネームを実行するコマンド
ls *.png | sort -t - -k 2 -n | xargs seqrename new
ファイルのソート
このケースではlsの結果をそのままパイプで渡すと順番がおかしくなるので、あらかじめソートをかけてやる必要がある。
ハイフンの後に続く数字を数値とみなしてソートする。
ls *.png | sort -t - -k 2 -n
- -t - は'-'でフィールドを区切る
- -k 2 は2番目のフィールドをソートに用いる
- -n はフィールドを数値に変換してソートする
連番リネームを行うシェルスクリプト
1番目の引数をプリフィックスとし、2番目以降の引数に渡されたファイルに連番を振ってリネームする。
拡張子は元のまま維持する。
-t オプションを付けると実際にリネームしないで結果をプレビューする。
#!/bin/bash
# seqrename
opt_test=false
while getopts t opt; do
case $opt in
t) opt_test=true
;;
esac
done
shift $((OPTIND - 1))
prefix=$1
shift
i=1
for oldname in $*; do
ext="${oldname##*.}"
newname=$prefix`printf "%04d" $i`.$ext
if $opt_test; then
echo $oldname "->" $newname
else
mv $oldname $newname
fi
i=`expr $i + 1`
done