2015-02-07 57 views
0

我有很多文件有一個奇怪的命名。例如,file_1_0_a32.elf , file_2_1_a32.elf, file_3_2_a32.elf在一個目錄中。我想將文件重命名爲新名稱,刪除文件file_2_1_a32.elf中的_1_a32,因此名稱變爲file_2.elf。我可以用mv輕鬆地編寫一個文件列表和新名稱的文件並執行該文件。我想知道如果我可以通過命令行本身做到這一點。我希望xargs命令可以在這裏有用。這就是我所能想到的ls *.elf | xargs -i mv {} modifiedFileName。我不知道如何完成這個。基本上我想有另一個階段來糾正由ls返回的文件名稱,並保留原來的名稱,所以我可以用它作爲mv的參數。有沒有辦法我可以做到這一點?如何將shell命令的結果替換爲另一個shell命令的輸入

回答

1

有用於該用途的情況下,存在的工具:rename

rename 's/_\d_a32//' *.elf 

xargs用例是使用管道值是。如果您想修改管道值且具有原始值,那麼xargs不適合工作。在這種情況下,最好使用while read循環結合搜索和替換bash參數擴展。

ls *.elf | while read -r filename 
do 
    mv "$filename" "${filename/_?_a32}" 
done 

有關更多信息,並在bash參數代替擴展:http://wiki.bash-hackers.org/syntax/pe#search_and_replace

當心,這將覆蓋不用問:file_1_0_a32.elffile_1_1_a32.elf都將被重命名爲file_1.elf一個覆蓋。如果下劃線之間的數字是單個數字(替換爲:_3_a32,未替換:_13_a32),它只會替換該模式。如果任何單個字符位於下劃線之間,它也會替換該模式(替換爲:_x_a32)。不幸的是,沒有簡單的方法來解決這個限制而不使用其他工具(提示:rename是這個用例的一個很好的工具)。

rename工具有時被稱爲prename(perl rename),通常作爲perl軟件包的一部分進行安裝。這裏是在Ubuntu的手冊頁:http://manpages.ubuntu.com/manpages/trusty/man1/prename.1.html

+0

強制性警告:有兩個名爲'rename'的工具,只有其中一個支持這種語法。 – 2015-02-07 07:55:11

+0

@lesmana感謝有關重命名工具的信息。我沒有意識到這一點。但我有困難使它的工作,我的要求仍然是重命名文件,但文件是不同的名稱,我想重命名'file_5_6.s'到'file_5_a32.s'我試過這個變種'-v's/_ \ d + \。s $/_ a32 \ .s /'* .s'但它不起作用,它不會對文件進行更改。我正在使用的正則表達式有問題。這可能有什麼問題? – Gautam 2015-02-08 04:06:22

+0

@UlrichSchwarz我如何找出哪一個是我的重命名工具,我檢查了我的電腦中重命名的手冊頁,它沒有提到正則表達式,它是否意味着提到的語法不起作用? – Gautam 2015-02-08 04:25:16