Linux
更改文件名中的第一個字元模式,而不更改文件名中其他地方的相同模式
在 Linux 伺服器上,我有一個目錄,裡面滿是名稱的數字文件。一些文件以兩個零開頭,例如 00305005。我正在編寫一個 bash shell 腳本,其中一個步驟是重命名所有以 00 開頭的文件,以便它們以 @0 開頭。我之前提到的文件是@0305005。
我遇到的問題是,當我嘗試重命名文件時,我最終將文件名中 00 的所有實例更改為 @0,如下所示:@0305@05。我一直在使用以下程式碼,但我不知道如何修復它:
for f in 00*; do mv "$f" "${f//00/@0}"; done
當你使用
${var//pattern/replacement}
時,\\
意思是“替換所有出現。在這種情況下,你只想替換第一個出現,所以你可以只使用/
。或者,你可以更具體,使用/#
,它只會在開頭替換string; 這應該沒有什麼區別,因為您只處理以 開頭的文件00
,但我傾向於使用它來明確目標。這是一個展示:$ f=00305005 $ echo "${f//00/@0}" # // = replace all @0305@05 $ echo "${f/00/@0}" # / = replace first one -- this does what you want @0305005 $ echo "${f/#00/@0}" # /# = replace at beginning -- this also does what you want @0305005 $ g=90305005 # Let's test with a name that *doesn't* start with 00 $ echo "${g/00/@0}" # / replaces the first match, no matter where it is in the string 90305@05 $ echo "${g/#00/@0}" # /# does not replace if the beginning does not match 90305005
我還建議
mv -i
用於任何類型的批量移動/重命名,以避免在出現命名衝突或錯誤時失去數據。因此,這是我的建議:for f in 00*; do mv -i "$f" "${f/#00/@0}"; done