2016-01-13 82 views
0

我有主目錄作爲主題,並在其中我有子目錄和子子目錄。子目錄類似於Beta_0.00 1,Beta_0.002,Beta_0.005Beta_0.01如何重命名unix中所有子目錄中的某些文件?

每個子目錄都有子目錄,如Iter_100,Iter_500,Iter_1000

我有四個文件名包含特殊符號。例如:

Aviva_buys_US_insurer_for_?1.6bn.txt 

我想將此文件重命名爲Aviva_buys_US_insurer_for_1.6bn.txt。同樣,其他文件通過刪除特殊符號來刪除特殊符號。

我試着使用:

find . -type f -exec mv Aviva_buys_US_insurer_for_?1.6bn.txt Aviva_buys_US_insurer_for_1.6bn.txt {} \; 

但是,這是行不通的。我該如何解決?請幫忙!

回答

3

由於mv命令包含一個靜態文件名,因此您的find命令無效。你想要一些東西,發現有一些奇怪的字符文件(其中我們真的不知道沒有更多的信息是什麼究竟你所說的「滑稽」的意思),然後運行在每個找到的文件名mv

我想不到一個簡單的方法來生成沒有產生子shell的有趣的字符的文件名,所以我們只需將所有找到的文件傳遞到一個子循環並生成新名稱。

我的「搞笑」的表達式包含相當有限的一組「無趣」的人物,並認爲一切爲「搞笑」。你可能想將其與一些擴展字符(也許你想保持:和/或!和/或+等等等等,但一定要保持-!否定操作後的第一個字符)。

funny='[!-A-Za-z0-9_./]' 
export funny # Make this variable visible in the subshell we spawn, too 
find . -type f -name "*$funny*" -exec bash -c 'for f; do 
    mv "${f}" "${f//$funny/}"; done' _ {} \+ 

它使用猛砸串插${variable//from/to}替代的「滑稽」字符所有出現;和find -exec \+將盡可能多的找到的文件傳遞給一個子shell。如果你的find不支持這個,你將需要重構。

這不完全是強大的 - 如果文件名僅由「搞笑」的字符,替代會產生一個空文件名,這是不允許的(不過,如果路徑是有效的,它會被移動到本身,這是無害的,因此)。

如果您想要進行實驗,請將mv更改爲echo mv並進行操作。當你看到你喜歡的結果時,將其改回。

相關問題