これはそれをするべきです:
for f in *.pdf
do
mv "$f" "${f//[^0-9]/}.pdf"
done
ただし、前に試してみてください:
for f in *.pdf
do
echo mv "$f" "${f//[^0-9]/}.pdf"
done
abc4.pdf と zzz4.pdf は両方とも 4.pdf に名前が変更されることに注意してください。したがってmv -i
、mv の代わりに使用することもできます。
更新: 説明:
拳の部分ははっきりしていると思います。*.pdf
グロビングと呼ばれ、.pdf で終わるすべてのファイルに一致します。for f in ...
それらを繰り返し処理し、毎回 f をそれらのいずれかに設定します。
for f in *.pdf
do
mv "$f" "${f//[^0-9]/}.pdf"
done
私は推測する
mv source target
も明らかです。ファイルの名前が「Unnamed File1」の場合、引用符でマスクする必要があります。
mv Unnamed File1 1.pdf
つまり、移動する複数のファイル (無名とファイル 1) があり、1.pdf が両方のファイルの移動先のディレクトリであると解釈されます。
さて、本当の問題はここにあると思います:
"${f//[^0-9]/}.pdf"
文字の外側の糊付けがあります。させて
foo=bar
いくつかの変数の割り当て
$foo
${foo}
"$foo"
"${foo}"
それらを参照する 4 つの正当な方法があります。最後の 2 つは空白などをマスクするために使用されるため、違いがない場合もあれば、違いがある場合もあります。
何かをくっつけたら
$foo4
${foo}4
"$foo"4
"${foo}"4
最初の形式は機能しません。シェルは変数 foo4 を探します。他の 3 つの式はすべて bar4 を参照します。最初に $foo が bar として解釈され、次に 4 が追加されます。一部の文字では、マスキングは必要ありません:
$foo/fool
${foo}/fool
"$foo"/fool
"${foo}"/fool
すべて同じように解釈されます。したがって、「${f//[^0-9]/}」が何であれ、「${f//[^0-9]/}.pdf」は「.pdf」が追加されます。
すべてのミステリーの核心にアプローチします。
${f//[^0-9]/}
これは、次の形式の置換式です。
${variable//pattern/replacement}
- variable is $f (ここでは中括弧内の $ は省略できます) は上から $f と言います。それは簡単でした!
- 交換は空です - それはさらに簡単でした。
- でも [^0-9] って結構複雑ですよね。
-
[0-9]
は 0 から 9 までのすべての数字のグループです。他のグループは次のようになります。
[0-4] digits below 5
[02468] even digits
[a-z] lower case letters
[a-zA-Z] all (common latin) characters
[;:,/] semicolon, colon, comma, slash
最初の文字として前にあるキャレット ^ は、グループの否定です。
[^0-9]
は、0 から 9 を除くすべて (ドット、コンマ、コロンなどを含む) がグループに含まれることを意味します。一緒:
${f//[^0-9]/}
$f からすべての非数字を削除し、
"${f//[^0-9]/}.pdf"
append .pdf - 全体がマスクされます。
${v//p/r}
とその仲間 (便利なものがたくさんあります) についてはman bash
、 の章で説明しParameter Expansion
ます。グループについては、手元にさらに読むための情報源がありません。