28
25

More than 5 years have passed since last update.

連番付きのファイルを、順序を維持したまま連番を振り直して、一括でリネーム

Last updated at Posted at 2014-11-17

状況

次のような名前のファイルが沢山ある。

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
28
25
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
25