2013-02-27 89 views
0

我試圖去除所有「?」在給定目錄中的文件名中有更多的子目錄,並且它們中有子目錄。我嘗試過使用一個簡單的perl正則表達式腳本與系統調用,但它無法遞歸到每個子目錄,手動將浪費太多時間。我如何解決我的問題?基於正則表達式遞歸地重命名目錄和文件

+0

這個Perl代碼在哪裏?告訴我們...... – 2013-02-27 22:21:10

+0

它只是分析「ls -R | grep'?'的輸出」,將文件名正則表達併發出系統調用來重命名它們。它不工作得很好,我發現使用「查找」和「重命名」你可以很容易地做到這一點,但我無法理解這兩個令人頭疼的文檔。 – 2013-02-27 22:26:36

回答

1

您可以使用查找命令以「?」搜索文件名。然後使用其exec參數運行腳本,該腳本將刪除「?」來自文件名的字符。考慮以下腳本,它可以爲您節省到/usr/local/bin/rename.sh,例如(記得給它+ X許可):

#!/bin/sh 
mv "$1" "$(echo $1| tr -d '?')" 

那麼這將做的工作:

find -name "*\?*" -exec rename.sh {} \; 
+0

我寧願使用別人的代碼(如重命名或其他),無論如何。 – 2013-02-27 22:31:01

+0

當然!我只是把你的腳本放在你想要使用它的地方,但找到解決方案遞歸部分。我會嘗試使用重命名或其他... – Claudio 2013-02-27 22:33:59

+0

是「?」位於名字的任何地方或總是在最後或什麼? – Claudio 2013-02-27 22:36:09

0

試試這個:

find -name '*\?*' -exec prename 's/\?//g' {} + 

https://metacpan.org/module/RMBARKER/File-Rename-0.06/rename.PL參見(這是在Ubuntu發行版的默認rename命令)

+0

您的回答無效。 – 2013-02-27 22:33:40

+0

你的錯誤是什麼?你見過我的鏈接嗎?如果它是「找不到命令」,那麼你應該考慮安裝'prename' – 2013-02-27 22:36:47

+0

沒有錯誤(即程序返回0)。它只是沒有「行動」(做任何事情)。 – 2013-02-27 22:52:10

0

用'?'查找所有名字並刪除所有這些。也許可以使用-exec選項,但需要額外的腳本

for f in $(find $dir -name "*?*" -a -type f) ; do 
    mv $f ${f/?/} 
done