とても簡単なようでしたが、完全にパニックになりました。言うまでもなく、私はこれに全く新しいものです。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.ext
。012
013
(ファイル全体が数字であるか、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
ファイルのリストを名前の逆順に並べ替えて、名前が変更される前に名前が変更されたことを確認します。O
n
n
On
q
file002
file003
file001
file002
ここでは、完全性チェックを無効にすると、一部のターゲットがソースでも検出されるという苦情が表示されますが、これは-f
aとファイルの両方が存在してもデータの損失を防ぐことができないことを意味します。file1
file01
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]
にのみ。0123456789
awk
mawk
[0-9]{3}
[0-9][0-9][0-9]