Linux

使用重命名從文件中刪除“.orig”並將“_1”添加到基本名稱

  • October 20, 2015

我正在使用腳本來備份文件,並避免覆蓋我使用過的文件cp --backup。這給我留下了許多看起來像example.mov.origtest.mov.orig. 我根本無法弄清楚正則表達式,並且想知道是否有人知道使用重命名切斷.orig並附_1加到基本名稱的方法。

本質上,我正在尋找的結果是命令會example.mov.orig變成example_1.mov我可以結合使用的命令find /example/ -name *.*.orig

輸出rename --version來自util-linux-ng 2.18

rename您需要的命令是:

  • 如果您使用renamefrom util-linux
rename . _1. *.orig && rename .orig '' *.orig

對於所有.以. 第二個將從文件名中刪除 。_1.``.orig``.orig

  • 如果您使用 perl-rename(在基於 Debian 的系統上預設),事情會更簡單,因為它使用 Perl 兼容正則表達式,因此可以一步完成所有操作:
rename 's/(\..*)\.orig/_1$1/' *orig

由於此版本使用 正則表達式將匹配第一個.( \..需要轉義,因為 ti 表示“任何字元” whan not escape),然後一切 ( .*) until .orig。因為第一個模式在括號內,所以它被“擷取”,以後可以稱為$1. 因此,替換將替換之前與 a_1和擷取的模式(第一個副檔名)匹配的任何內容,並將同時刪除.orig.

您可以將命令與find以下內容組合:

find /example -name '*.orig' -exec rename . _1. {} +
find /example -name '*.orig' -exec rename .orig '' {} +

或者:

find /example -name '*.orig' -exec rename 's/(\..*)\.orig/_1$1/'

你甚至不需要find這個。如果您的所有文件都在同一個目錄中,您可以直接使用上面的命令,或者使其遞歸(假設您使用的是 bash):

shopt -s globstar                               ## make ** recurse into subdirectories
rename.ul . _1. **.orig && rename.ul .orig '' **.orig  ## util-linux
rename  's/(\..*)\.orig/_1$1/' **orig                  ## perl rename

事實上,嚴格來說,你甚至不需要rename. 您可以在 shell 中執行所有操作(有關 shell 的字元串操作能力的說明,請參見此處):

for file in **/*.orig; do 
   newname="${file%%.*}_1.${file#*.}"
   mv "$file" "${newname/.orig/}"
done

最後,關於 glob 的註釋(-name使用 glob,而不是正則表達式)。這*.*.orig是“以”結尾的任何內容的 Windows glob 語法.orig。等效項以及您應該使用的find*.orig. *單獨匹配任何東西,使用*.*.orig只會匹配帶有兩個副檔名的文件名,最後一個是.orig.

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