CentOSからファイル名の一部を削除するためにbashスクリプトを作成しようとしています。私のファイル名は次のとおりです。
119903_Relinked_new_3075_FileNote_07_02_2009_JHughes_loaMeetingAndSupport_FN_205.doc
119904_relinked_new_2206_Support_Intensity_Scale_SYCH_SIS_264549.pdf
119905_relinked_new_3075_Consent_07_06_2009_DSweet_CRFA_CF_16532.docx
29908_relinked_new_2206_Assessor_Summary_Report_SERT_I_OTH_264551.pdf
009712_relinked_new_3075_Consent_07_06_2009_CWell_DPRT_check_CF_16535.pdf
ファイル名から削除したいです119903_Relinked_new_
。最終結果は次のとおりです。
3075_FileNote_07_02_2009_JHughes_loaMeetingAndSupport_FN_205.doc
2206_Support_Intensity_Scale_SYCH_SIS_264549.pdf
3075_Consent_07_06_2009_DSweet_CRFA_CF_16532.docx
2206_Assessor_Summary_Report_SERT_I_OTH_264551.pdf
3075_Consent_07_06_2009_CWell_DPRT_check_CF_16535.pdf
私は良い結果が得られずにいくつかのスクリプトを試しました。ほとんどの場合、前の数字が_Relinked_new_
異なり、ファイル拡張子は.pdf
、など.docx
でさまざまです。.doc
どんな助けでも大変感謝します。
答え1
使用名前(1)ツール(システムによって、またはrename
とprename
呼ばれる場合があります):perl-rename
rename 's/[0-9]+_[rR]elinked_new_//' /path/to/dir/*
正規表現を使用してパターンを一致させ、指定されたファイルの内容に置き換えます。
答え2
これらのツールがない場合は、rename
パラメータ置換と一緒に単純なシェルループを使用してファイル名を一度に1つずつ変更します。
for name in /path/to/dir/*_[rR]elinked_new_*
do
newname=${name##*/}
newname=${name%/*}/${newname#*_[rR]elinked_new_}
# or:
# newname=$(basename "$name")
# newname=$(dirname "$name")/${newname#*_[rR]elinked_new_}
mv -- "$name" "$newname"
done
ループ内では、値は最初に変数のファイル名部分(パス名の最後のスラッシュの後の最後のビット)newname
として評価されます。name
次に、変数がディレクトリパスであるかのように偽装し、ファイル名の先頭からnewname
シェルパターンに一致するテキストの結果を削除して変数を変更します。*_[rR]elinked_new_
まず、現在のディレクトリをファイルのあるディレクトリに変更すると、コードが少し単純化される可能性があります。
cd /path/to/dir || exit
for name in *_[rR]elinked_new_*
do
newname=${name#*_[rR]elinked_new_}
mv -- "$name" "$newname"
done
答え3
これは実際に「引数リストがあまりにもキム」問題の説明でしたが、説明ボックスで混乱して見え始めたので、今回答になりました。 :)
そのエラーが発生する理由は、*
長さ制限があるコマンドラインのディレクトリにすべてのファイルを配置しようとするためです。代わりに、ファイルを繰り返すか、次のような同様のfind
操作を行い、各ファイルに対して個別に名前変更を呼び出すことができます。
find /path/to/dir -iname '*relinked_new_*' -exec prename 's/[0-9]+_[rR]elinked_new_//' {} \;