数字のタイトルファイル名を1桁に変更するには?

数字のタイトルファイル名を1桁に変更するには?

とても簡単なようでしたが、完全にパニックになりました。言うまでもなく、私はこれに全く新しいものです。000からのファイル番号を含むディレクトリがあります020。 1を000追加してこのファイルの名前を変更したいと思います001。理想的にはコマンドを使用しますawkが、アドバイスをいただきありがとうございます。

プレフィックスがない場合は000フルネームです。とマークされたファイルはありません021

ベストアンサー1

zsh代わりにを使用すると、bash次のことができます。

autoload -Uz
zmv -f -n '*(#qnOn)' '${f//(#m)<->/${(l[3][0])$((MATCH+1))}}'

現在のディレクトリのファイル名にある各番号を増やし、長さをゼロで埋め、長さを3にします。たとえば、またはfoo-1-2-003.extに名前を変更しますfoo-002-003-004.ext012013

(ファイル全体が数字であるか、0から20までのファイル名を変更するか、0から20までのファイル名を3桁の数字に変更するだけでzmv -f -n '<->(#qnOn)' '${(l[3][0])$((MATCH+1))}'十分です。)<0-20><-><0-20>~^[0-9](#c3)

代替項目は、パターンと共にksh-styleを使用して計算され、一致するコンテンツのキャプチャをトリガし、任意の10進数シーケンスの無限形式と一致します。左パディングパラメータ拡張フラグはパディングに使用されます。${var//pattern/replacement}(#m)<->(#m)$MATCH<-><3-12>l[width][pad]

修飾子を使用してnファイルのリストを名前の逆順に並べ替えて、名前が変更される前に名前が変更されたことを確認します。OnnOn qfile002file003file001file002

ここでは、完全性チェックを無効にすると、一部のターゲットがソースでも検出されるという苦情が表示されますが、これは-faとファイルの両方が存在してもデータの損失を防ぐことができないことを意味します。file1file01

zshはありませんが、bashがあり、000〜020という名前のファイルがあり、名前を変更したいファイルである場合(後述のように)、次のことができます。

for file in {020..000}; do
  printf -v new %03d "$(( 10#$file + 1 ))"
  mv "$file" "$new"
done

{020..000}(bashは実際にbashからコピーされたzshからコピーされ、-vコードは両方のシェルで動作し、10#引用符は必要ありませんzsh。)

ここではファイル名がかなり長いため、次のこともできます。

ls -rq | LC_ALL=C awk '
  /^[0-9]{3}$/ && $0 <= 20 {
    printf "mv %s %03d\n", $0, $0+1
  }' | sh

-q(標準ですが現在busyboxではサポートされていませんls)名前に改行文字を含むファイルがあっても、各行にファイル名があることを確認してください。LC_ALL=Cしたがって、一致する場合[0-9]にのみ。0123456789awkmawk[0-9]{3}[0-9][0-9][0-9]

おすすめ記事