Linux

更改文件名中的第一個字元模式,而不更改文件名中其他地方的相同模式

  • July 13, 2019

在 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

引用自:https://serverfault.com/questions/975064