間違った数値形式でファイル名を一括変更するには?

間違った数値形式でファイル名を一括変更するには?

数値形式が正しくないファイルがたくさんあります。

prefix-#.ext       | for files with number 1-9
prefix-##.ext      | for files with number 10-99
prefix-###.ext     | for files with number 100-999

さらなる処理のために、すべての名前は次の形式でなければなりませんprefix-###.ext。これを行う簡単な方法はありますか?

答え1

Debian、Ubuntu、およびその派生製品では、次のものを使用できます。renamePerlスクリプト:

rename 's/(?<=-)([0-9]+)/sprintf "%03d", $1/e' prefix-*.ext

一部のシステムでは、このコマンドをまたはとしてprenameインストールできますperl-rename。これはrenameutil-linuxファミリのユーティリティではなく、これを行う簡単な方法を提供しません。

zshでは利用可能ですzmv名前の変更とl パラメータ拡張フラグ0で埋めます。

autoload -U zmv
zmv '(prefix-)(*)(.ext)' '$1${(l:3::0:)2}$3'

通常のシェルループを使用してこれを実行することもできます。シェルには文字列操作のための良い構造はありません。 0で埋める1つの方法は1000を追加し、先行1

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}; n=$((n+1000))
  mv "$x" "${x%-*.ext}${n#1}${x##*-}"
done

別の方法はprintfユーティリティを呼び出すことです。

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}
  mv "$x" "${x%-*.ext}$(printf %03d "$n")${x##*-}"
done

答え2

たぶんこのようなものかもしれません(テストされていません)

for n in *.ext; do
    echo mv "$n" \
      "prefix-$(printf %03d "$(basename ${n#prefix-} .ext)").ext"
done

echo実際の名前を変更するには削除してください。

注:この方法が機能するには、ファイルと同じディレクトリにある必要があります。ディレクトリ部分を含むパス名の処理はより複雑です。

答え3

for file in prefix-*.ext
do
    num=`echo $file | sed 's/prefix-\(.*\).ext/\1/'`
    [ $num -lt 100 ] && mv $file prefix-`printf "%03d" ${num}`.ext
done

関連情報