我有一個bash腳本的問題... 我想以遞歸的方式將所有文件,文件夾和子文件夾從 小寫改爲大寫(或反之亦然)。 我寫過這個腳本,但它不起作用。在bash中重命名文件夾,文件和子文件夾
find . -depth -iname \* -exec mv {} `echo {} | tr [:upper:] [:lower:]` \;
有什麼建議嗎? 感謝
我有一個bash腳本的問題... 我想以遞歸的方式將所有文件,文件夾和子文件夾從 小寫改爲大寫(或反之亦然)。 我寫過這個腳本,但它不起作用。在bash中重命名文件夾,文件和子文件夾
find . -depth -iname \* -exec mv {} `echo {} | tr [:upper:] [:lower:]` \;
有什麼建議嗎? 感謝
爲什麼不使用一個簡單的while循環:
find testdir/ -depth | while read file; do NEWNAME=$(dirname "$file")/$(echo $(basename "$file") | tr '[:lower:]' '[:upper:]'); mv "$file" "$NEWNAME"; done
的問題是,在反引號,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 . .
而出現錯誤。
我試過使用你的第一個腳本,但它只是改變文件夾樹的第一個「級別」。如果我有,例如,DocumentsFolder-JobFolder-Test.txt,執行後我有DOCUMENTFOLDER-JobFolder-Test.txt。我想要大寫的所有文件夾,子文件夾和文件,如DOCUMENTFOLDER-JOBFOLDER-TEST.TXT。 – Ant4res
對不起,我更正了代碼。它應該如預期那樣工作。 – johnbaum
謝謝!有用! – Ant4res