如何使用“查找”通過正則表達式搜尋文件名並重命名此文件
我試圖找到所有以結尾的文件:
- 祖先-人類-奧德賽-拖車- 720-1262 .mp4
- 高科技潛水員- 1080-1234 .mp4
- 亞馬遜潛水員- 720-1323 .mp4
並像這樣重命名這些文件:
- 720-1262 .mp4
- 1080-1234 .mp4
- 720-1323 .mp4
我使用正則表達式但沒有,為什麼?請問怎麼了?
find . -regex '^.*-(([0-9])*-([0-9])*)\.mp4'
只有一個目錄和這些文件,沒有子目錄。大約 300 個文件 .mp4
GNU
find
支持多種正則表達式方言(該-regextype
選項允許您選擇一種)。括號在其中一些是特殊字元,需要反斜杠轉義才能在其他字元中獲得特殊含義。根據線上文件,使用的預設方言
-regex
是“POSIX basic”,而線上可用的手冊頁說預設方言是“Emacs” 1。在這兩個中,括號都需要反斜杠轉義才能用作分組字元。這些會起作用:
find . -regex '^.*-\(\([0-9]\)*-\([0-9]\)*\)\.mp4'
find . -regextype posix-extended -regex '^.*-(([0-9])*-([0-9])*)\.mp4'
但是,
^
這裡不需要(-regex
對文件名執行完全匹配)並且分組似乎沒有必要;因此find . -regex '.*-[0-9]*-[0-9]*\.mp4'
應該足夠了(撇開與排序規則有關的潛在問題:
[0-9]
可能匹配比 更多的東西[0123456789]
,具體取決於您的語言環境)。關於重命名:如果您可以使用 Perl 實現
rename
,將是一個方便的選擇。假設所有要重命名的文件都在目前工作目錄中(不需要find
):perl-rename -nv 's/.*-(\d*-\d*\.mp4)\Z/$1/' -- *
(其中
\Z
相當於在主題2$
末尾匹配的標準正則表達式)。
n
當您對命令的功能感到滿意時,請刪除(試執行)選項。注意
- 這也將重命名
--.mp4
為-.mp4
:用於\d+
要求在最後一個數字之前和之後至少出現一個數字-
.*
還需要重命名隱藏文件或者,使用 GNU
find
和標準mv
實用程序(也遞歸下降到子目錄):find . -regex '.*-[0-9]*-[0-9]*\.mp4' -execdir sh -c ' for file; do toremove=${file%-*-*.mp4} echo mv -- "$file" "${file#"$toremove"-}" done' mysh {} +
echo
當您對命令的功能感到滿意時,請刪除。¹ 正如Stéphane Chazelas在評論中指出的那樣,savannah.org 上已經送出了一些關於文件中這種不准確/不一致的錯誤報告:https ://savannah.gnu.org/bugs/?58384 ,https://savannah。 gnu.org/bugs/?52592 , https://savannah.gnu.org/bugs/?61304
² Perl
$
在主題末尾匹配,但也在主題末尾的換行符之前,所以在工作時很好在可能包含或不包含分隔符的文本行上,最好\Z
在處理其他任何內容(例如此處的文件名)時使用。