同様の名前を持つ何千ものファイル名を変更する

同様の名前を持つ何千ものファイル名を変更する

私のファイル名を変更するためのbashスクリプトを作成しています。ファイルは同じフォルダにあり、すべて次のようになります。

1xxx_(文字列)=(文字列)=1234567890

今私が望むのは最後の1234567890だけを残すことです。デフォルトでは、=の最初の発生から2番目の発生までのすべての文字を削除します。

答え1

シェルのパラメータ拡張機能を使用できます。

${parameter#word}
${parameter##word}
       Remove matching prefix pattern.  The word is expanded to produce
       a pattern just as in pathname expansion.  If the pattern matches
       the  beginning of the value of parameter, then the result of the
       expansion is the expanded value of parameter with  the  shortest
       matching  pattern  (the ``#'' case) or the longest matching pat‐
       tern (the ``##'' case) deleted.

そのように

for file in *; do echo mv -- "$file" "${file##*=}"; done

echo正しいことをしているような場合は削除してください)。


発生する可能性のある問題の1つは、プレフィックスを削除するとファイル名が一意でなくなる可能性があることです。-nまたは、オプションを使用して--no-clobberこれらのケース名の変更をスキップすることを選択できますmv

for file in *; do mv --no-clobber -- "$file" "${file##*=}"; done

または、-bまたはオプションを使用して--backup別のバックアップを作成します。最も簡単です。

for file in *; do mv --backup=numbered -- "$file" "${file##*=}"; done

これにより、区別サフィックスなどが追加されます.~1~.~2~

答え2

Perlの名前変更スクリプト(Debian / Ubuntuの標準またはここで利用可能:http://tips.webdesign10.com/files/rename.pl.txt)は正規表現に基づいてファイルの名前を変更します。-n実際に名前を変更せずに指定されたファイルのみを印刷するので、作業を実行する前にテストできます。

# Check before renaming...
$ rename -n 's/^.*=//' *
1xxx_DSAFDSAFDSFA=FDAFDSAFDSAFSDA=12341243142 renamed as 12341243142

# now rename all files
$ rename 's/^.*=//' *

*ワイルドカードベースのファイル(すべてのファイルや*.txtテキストファイルなど)で簡単に操作でき、すべてのPerl正規表現を許可するため、非常に柔軟なツールです。

答え3

awkこの場所も保存できます。使っています。必要に応じて、cp次のように変更します。mv

ls | awk -F"=" '{system("cp -i "$0" "$3)}'

安全のため-iパラメータとしても使用します。cp

関連情報