Files
使用正則表達式重命名文件以刪除部分名稱
我有一堆文件需要在 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
您嘗試使用的語法適用於 perl
rename
命令。根據您的作業系統,它可能可用或可安裝為prename
orperl-rename
,但您希望那個而不是rename
from使用您正在嘗試的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"
: 重命名文件。