数値形式が正しくないファイルがたくさんあります。
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、およびその派生製品では、次のものを使用できます。rename
Perlスクリプト:
rename 's/(?<=-)([0-9]+)/sprintf "%03d", $1/e' prefix-*.ext
一部のシステムでは、このコマンドをまたはとしてprename
インストールできますperl-rename
。これはrename
util-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