2011-11-16 194 views
0

我有一個bash腳本的問題... 我想以遞歸的方式將所有文件,文件夾和子文件夾從 小寫改爲大寫(或反之亦然)。 我寫過這個腳本,但它不起作用。在bash中重命名文件夾,文件和子文件夾

find . -depth -iname \* -exec mv {} `echo {} | tr [:upper:] [:lower:]` \; 

有什麼建議嗎? 感謝

回答

1

爲什麼不使用一個簡單的while循環:

find testdir/ -depth | while read file; do NEWNAME=$(dirname "$file")/$(echo $(basename "$file") | tr '[:lower:]' '[:upper:]'); mv "$file" "$NEWNAME"; done 
+0

我試過使用你的第一個腳本,但它只是改變文件夾樹的第一個「級別」。如果我有,例如,DocumentsFolder-JobFolder-Test.txt,執行後我有DOCUMENTFOLDER-JobFolder-Test.txt。我想要大寫的所有文件夾,子文件夾和文件,如DOCUMENTFOLDER-JOBFOLDER-TEST.TXT。 – Ant4res

+0

對不起,我更正了代碼。它應該如預期那樣工作。 – johnbaum

+0

謝謝!有用! – Ant4res

1

的問題是,在反引號,echo {} | tr [:upper:] [:lower:]你的命令,獲取由外殼第一延展,所以什麼find實際看到的論據是

find . -depth -iname \* -exec mv {} {} \; 

(輸入{}運行tr [:upper:] [:lower:]只是給你{}馬上回來)。

這裏有一個解決方法是,使用一個子shell作爲-exec命令:

find . -mindepth 1 -depth -iname \* -exec \ 
    sh -c 'mv "$0" "`tr \[:upper:\] \[:lower:\] <<<"$0"`"' {} \; 

或者其可讀性,使用$()語法:

請注意,您還需要引用tr字符範圍來阻止shell擴展它們!

添加-mindepth 1也是一個好主意,因此您不會因嘗試運行mv . .而出現錯誤。

+0

感謝您的解釋......我試圖運行的腳本,但我得到了很多語法錯誤和文件夾的子文件夾和文件名 – Ant4res

+0

內沒有變化看起來你已經通過其他方式得到了答案,但是對於記錄而言,原始代碼無法正確使用帶空格的文件名,這可能是問題所在。我現在糾正了它。一旦你達到這麼多的報價水平,循環解決方案開始看起來相當不錯, - ;) –

+0

感謝您的回答!但是,<<< $ 0是什麼意思? – Ant4res