web-dev-qa-db-ja.com

countでファイルの名前を変更する方法は?

私はこのようなディレクトリを持っています:

randomized_quad015.png
randomized_quad030.png
randomized_quad045.png
randomized_quad060.png
randomized_quad075.png
randomized_quad090.png
randomized_quad1005.png
randomized_quad1020.png
randomized_quad1035.png
randomized_quad1050.png
randomized_quad105.png
randomized_quad1065.png
randomized_quad1080.png
randomized_quad1095.png
randomized_quad1110.png
randomized_quad1125.png
randomized_quad1140.png

そして、番号の前に0を追加した最初のファイルの名前を変更したい:

randomized_quad0015.png

しかし、私は方法がわかりません。手助け?

5
nkint

他の回答のさまざまなPerlベースのメソッドの代替として、この特定の例を実行できます。また、プレーンbashを使用して他の多くの同様のメソッドを実行できます。

for i in randomized_quad???.png; do   
  mv $i randomized_quad0${i#randomized_quad}
done

これは、番号領域に3文字のみのファイル名をループし、中括弧内の変数式は各ファイル名を取り、「randomized_quad」を先頭から切り取り(#演算子を使用)、先頭に「randomized_quad0」を追加します。

このような他のエキサイティングに便利な演算子には次のものがあります。

  • %-最後から何かを切り取る
  • /-検索と置換(最初の一致の場合は/、すべての一致の場合は//
  • :-部分文字列の抽出用

例を含むより完全なリストは here です。また、これらはPOSIXスタイルの正規表現を使用するため、.は「。」だけでなく任意の文字に一致します。 「。」に一致させたい場合は、バックスラッシュで「エスケープ」する必要があります。

TestVariable1="filename.png"
TestVariable2="filename0png"

echo "${TestVariable1%.png}"
> filename

echo "${TestVariable2%.png}"
> filename

echo "${TestVariable1%\.png}"
> filename

echo "${TestVariable2%\.png}"
> filename0png
4
Aesin

rename は、名前を変換するために Perl コマンドを使用して、ファイルの名前を変更できるコマンドラインツールです。この状況で一般的に使用されるPerlコマンドはs/REGEXP/REPLACEMENT/です。

質問を正しく解釈する場合、4桁未満の名前の先頭に0を追加して、すべての名前が4桁になるようにします。このわずかに複雑な式は、1、2、または3桁のファイル名がある一般的なケースを処理します。すべてのファイルを4桁に揃えます。末尾のe修飾子により、置換は文字列としてではなくPerl式として解釈されます。この式は、数字を4桁にパディングするのに必要な回数だけ0を繰り返します。

rename 's/(?=([0-9]+)\.)/"0" x (4 - length($1))/e' *.png

すべての名前を変更するファイルが3桁の場合、次のような簡単な方法があります。

rename 's/[0-9]+\./0$&/' *[!0-9][0-9][0-9][0-9].png

または

rename 's/(?<=[^0-9])[0-9]{3}\./0$&/' *.png
6
Gilles
rename 's/quad([0-9]{3})\.png/quad0$1/' randomized_quad*
0
January

Bashの最新バージョンでは、次のように書くことができます。

for f in randomized_quad*.png; do
    if [[ $f =~ [1-9][0-9]* ]]; then
        new=$(printf "randomized_quad%04d.png" ${BASH_REMATCH[0]})
        [[ $f != $new ]] && mv -v $f $new
    fi
done
0
glenn jackman