使用重命名從文件中刪除“.orig”並將“_1”添加到基本名稱
我正在使用腳本來備份文件,並避免覆蓋我使用過的文件
cp --backup
。這給我留下了許多看起來像example.mov.orig
和test.mov.orig
. 我根本無法弄清楚正則表達式,並且想知道是否有人知道使用重命名切斷.orig
並附_1
加到基本名稱的方法。本質上,我正在尋找的結果是命令會
example.mov.orig
變成example_1.mov
我可以結合使用的命令find /example/ -name *.*.orig
輸出
rename --version
來自util-linux-ng 2.18
rename
您需要的命令是:
- 如果您使用
rename
fromutil-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
.