2

次のようなディレクトリにファイルがあります。

asdfs54345gsdf.pdf
gsdf6456wer.pdf
oirt4534724wefd.pdf

すべてのファイルの名前を数字 + .pdf だけに変更したいので、上記のファイルの名前は次のように変更されます。

54345.pdf
6456.pdf
4534724.pdf

最適なのは、ネイティブの Bash コマンドまたはスクリプト (OSX 10.6.8) です。

私が拾ったいくつかの手がかりには、

sed 's/[^0-9]*//g' input.txt 
sed 's/[^0-9]*//g' input.txt > output.txt 
sed -i 's/[^0-9]*//g' input.txt 
echo ${A//[0-9]/} rename 's/[0-9] //' *.pdf 
4

1 に答える 1

6

これはそれをするべきです:

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ます。グループについては、手元にさらに読むための情報源がありません。

于 2012-04-27T23:53:26.957 に答える