拡張子を保持しながら、ゼロで埋められた数字でファイル名を変更したいと思います。
例
a.abc
b.cde
c.xyz
001.abc
002.cde
003.xyz に名前を変更します。
:~/x$ rename -n -v 's/.+/our $i; sprintf("%03d.jpg", 1+$i++)/e' *
#output>
rename(a.abc, 001.jpg)
rename(b.cde, 002.jpg)
rename(c.xyz, 003.jpg)
#then
:~/x$ echo "a.abc"
a.abc
:~/x$ echo ${_##*.}
#output>
abc
so I tried>
:~/x$ rename -n -v 's/.+/our $i; sprintf("%03d.${_##*.}", 1+$i++)/' *
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at (user-supplied code).
Missing right curly or square bracket at (user-supplied code), within string
syntax error at (user-supplied code), at EOF
使用提案「名前変更」注文する?
ベストアンサー1
rename -n -v 'our $n; my $zn=sprintf("%03d", ++$n); s/[^.]*/$zn/' *
これは期待どおりに機能します。 Perlコードを配置する代わりに~へ交換して実行してみましょう。今後デリゲート。
正規表現は、[^.]*
ファイル名の最初の点まで(含まない)文字列の長さと一致します。
一致させるために最後点を指定し、置換を使用し、.*\.
代替側に点を挿入します。
rename -n -v 'our $n; my $zn=sprintf("%03d", ++$n); s/.*\./$zn./' *
これにより、ディレクトリ名も変更されます。
*
または、シェルglobがファイルを展開する順番でファイルを列挙すると仮定し、単純なシェルループを使用して次のようにしますbash
。
n=1
for filename in *; do
[ ! -f "$filename" ] && continue
zn=$( printf '%03d' "$n" )
mv -i -- "$filename" "$zn.${filename##*.}"
n=$(( n + 1 ))
done
また、通常のファイル(またはそのファイルへのシンボリックリンク)を参照しない名前はスキップされます。他にも次のようなものがある非常に近いカウンタ()とゼロで埋められたカウンタバリアント()をrename
保持する上記のPerlバリアントです。n
zn
変数n
は単純なカウンタで、$zn
同じ値を持つが$n
ゼロで埋められた3桁の数字です。
値は$zn.${filename##*.}
ゼロで埋められた数字に展開され、その後にドットと元のファイル名の最後のファイル名のサフィックスが続きます。元のファイル名に複数の点がある場合最後ドットがゼロで埋められた数字に置き換えられます。ほとんどを置き換える##
ように変更#
最初指す。
これは、現在のディレクトリのファイルでのみループを実行すると仮定します。