Shell-Script

刪除文件名中特定字元串的腳本

  • April 18, 2022

我正在嘗試提出一個 bash 腳本來刪除 CentOS 上的部分文件名。我的文件名是:

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。任何幫助將不勝感激。

使用prename(1)工具(它可能被呼叫renameprename取決於perl-rename您的系統):

rename 's/[0-9]+_[rR]elinked_new_//' /path/to/dir/*

這將使用正則表達式來匹配模式並將其替換為指定文件上的任何內容。

如果沒有該rename工具,則使用帶有參數替換的簡單 shell 循環一次重命名文件:

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通過使用目錄路徑和從文件名開頭刪除與 shell 模式匹配的任何文本的結果來修改變數*_[rR]elinked_new_

通過首先將目前目錄更改為文件所在的目錄,可以稍微簡化程式碼:

cd /path/to/dir || exit

for name in *_[rR]elinked_new_*
do
   newname=${name#*_[rR]elinked_new_}
   mv -- "$name" "$newname"
done

引用自:https://unix.stackexchange.com/questions/699471