Files

使用正則表達式重命名文件以刪除部分名稱

  • November 28, 2022

我有一堆文件需要在 Linux 機器上處理。這些文件如下所示:

2009-08-18T034353_DR1_4N-NAC_123456_1234_band1.ntf          
2009-08-18T034353_DR1_4N-NAC_123456_1234_browse.jpg    
2009-08-18T034353_DR1_4N-NAC_123456_1234_band2.ntf    
2009-08-18T034353_DR1_4N-NAC_123456_1234_license.txt    
2009-08-18T034353_DR1_4N-NAC_123456_1234_metadata.xml     
2009-08-18T034353_DR1_4N-NAC_123456_1234_readme.txt      
2009-08-18T034353_DR1_4N-NAC_123456_1234_udm.tif

我想刪除這部分:-NAC_123456_1234第一部分可以由字母數字字元組成,而數字部分只能由數字字元組成。

我嘗試了重命名命令,但無法正常工作。我想到了類似的東西:

rename '/-[a-zA-Z]+_[0-9]+_[0-9]+//' *.*

有人可以幫我解決我所缺少的嗎?

我的重命名版本是:

rename from util-linux 2.23.2

您嘗試使用的語法適用於 perlrename命令。根據您的作業系統,它可能可用或可安裝為prenameor perl-rename,但您希望那個而不是renamefrom使用您正在嘗試的util-linux正則表達式語法。而且,即使有了這些,您也需要一些稍微不同的東西:

perl-rename 's/-[a-zA-Z]+_[0-9]+_[0-9]+//' *.*

實際上,因為你想要的只是刪除最後一個之後的所有內容-,你可以使用:

perl-rename 's/(.*)-(.*)(\.*)/$1$2/' *.*

不過,您不需要使用此工具。你可以只執行一個小的 shell 循環:

for file in *; do
   ext="${file##*.}"
   newName="${file%-*}.$ext"
   echo mv -- "$file" "$newName"
done

那隻會列印將要執行的命令。如果您對它們是正確的感到滿意,請刪除echo並再次執行以實際重命名。

解釋

  • for file in *: 將遍歷目前目錄中的所有文件(和目錄),將每個文件保存為$file.
  • ext="${file##*.}": 該語法從 . 的開頭${variable##pattern}刪除最長的匹配項。所以在這裡,這將刪除所有內容,直到最後一個,給我們留下文件的副檔名。pattern``$variable``.
  • newName="${file%-*}.$ext": 語法從 的末尾${variable%pattern}刪除最短的匹配。所以在這裡,這將留給我們一切,直到最後。然後我們將副檔名添加到它,這給了我們新的文件名。pattern``$variable``-
  • mv -- "$file" "$newName": 重命名文件。

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