Find

如何使用“查找”通過正則表達式搜尋文件名並重命名此文件

  • May 8, 2022

我試圖找到所有以結尾的文件:

  • 祖先-人類-奧德賽-拖車- 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

GNUfind支持多種正則表達式方言(該-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+要求在最後一個數字之前和之後至少出現一個數字-
  • .*還需要重命名隱藏文件

或者,使用 GNUfind和標準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在處理其他任何內容(例如此處的文件名)時使用。

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