Shell-Script
刪除文件名中特定字元串的腳本
我正在嘗試提出一個 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_
是不同的,並且文件副檔名因.docx
等而異.doc
。任何幫助將不勝感激。
使用prename(1)工具(它可能被呼叫
rename
或prename
取決於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