題 Unix Bash使用正則表達式重命名文件


我想使用正則表達式重命名文件夾中的所有文件(在名稱末尾添加名稱)並移動到另一個文件夾。

我認為它應該是這樣的:

mv -v ./images/*.png ./test/*test.png,但它不起作用。

誰能建議我一個解決方案?


4
2017-12-25 14:37


起源




答案:


我也喜歡John T發布的重命名命令,但它並不適用於所有系統。這應該適用於所有地方

for i in *.png; do mv -v $i `basename $i .png`.test.png; done

6
2017-12-25 14:52



這是它返回的內容:用法:mv [-f | -i | -n] [-v]源目標mv [-f | -i | -n] [-v] source ...目錄 - mxg
為我工作:也許你應該嘗試引用你的$ i的實例:“$ i” - Jeremy L
它也適用於mac。 - mxg
這或多或少是執行任務的標準UNIX方式,因為您只需要一個Bourne shell。 perl方法是新奇的。很酷,但新奇。 - pcapademic
@EricJLN:與UNIX本身相比,它只是“新奇的” - Perl已經存在了20多年。 (相比之下,Bourne shell只有十年之久; bash 與Perl的年齡相同。)Perl Cookbook於1998年出版,包括同一劇本的簡單版本;它肯定比那個年長。 - quack quixote


有一個方便的perl文件重命名腳本,可以在基於Debian的系統(包括Ubuntu)上安裝主要的Perl包。它通常被命名 rename,但有時被稱為 prename (Perl重命名)。使用這樣:

rename expr file1 file2 file3

該命令使用Perl進行評估 expr 為每個人 file 參數,它將每個文件重命名為輸出 expr evalutation。因此,對於像您的示例那樣的簡單正則表達式替換:

rename 's(images/(.*)\.png$)(test/$1.test.png)' ./images/*

# here's the expression:
# s()()   -- just like s/// (but i don't need to escape the / in the filename)
#   match regex:  images/(.*)\.png$     -- match filenames of the form images/*.png
#   replace:      test/$1.test.png     -- turn them into test/*.test.png

如果文件與表達式不匹配(例如,非PNG文件),則替換將不執行任何操作,並且不會更改其文件名。


7
2017-12-25 17:18





您可以使用 rename 它接受正則表達式或這個基本的3參數語法:

重命名.png .test.png * .png
  • 第一個參數是文件名中要替換的內容
  • 第二個參數是用什麼代替它
  • 第三個參數是執行操作的文件,在本例中是所有png。

2
2017-12-25 14:44



這與我描述的perl重命名相同,還是其他什麼?我不熟悉你描述的語法。 - quack quixote
我不這麼認為。這個是二進製文件。看這裡: linux.die.net/man/1/rename 和這裡: pastebin.ca/1726871 。 - John T
thx,這很有趣。可能是為什麼我提到的重命名安裝到 /usr/bin/prename 然後符號鏈接到 /usr/bin/rename。 - quack quixote