私のファイル名を変更するための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