2016-10-03 71 views
1

我發現了幾個看起來應該可以工作的答案,但是當我運行腳本以嘗試從目錄名稱中刪除點時,點似乎無法引用腳本。舉例來說,我已經在一個名爲s. om. e dir (25)目錄試過這樣:刪除目錄名稱(shell)中的所有點

for dir in $(find . -type d -maxdepth 1 -name *.*); do 
    mv "$dir" `echo "$dir" | tr '.' '_'` 
done 

,並得到這個輸出終端:

mv: rename ./s. to _/s_: No such file or directory 
mv: rename om. to om_: No such file or directory 
mv: rename e to e: No such file or directory 
mv: rename dir to dir: No such file or directory 
mv: rename (25) to (25): No such file or directory 

如何重命名從s. om. e dir (25)目錄中s_ om_ e dir (25)沒有密碼破譯的點的每個實例?

+0

嘗試'重命名。 _ * /'。 – alvits

回答

2

問題上的find輸出使用for/in

如果你有rename Perl的版本,你可以簡單地做

rename 'tr/./_/' *.*/ 

否則,

for i in *.*; do 
    [ -d "$i" ] || continue 
    mv -- "$i" "${i//./_}" 
done 

應該工作。

+0

謝謝!它看起來像我沒有perl我有權訪問的框,我不想永遠等待管理員安裝它,所以感謝bash' for'循環!像魅力一樣工作。 –

3

相反的echo | tr,你可以簡單地使用參數替代:

mv -- "$dir" "${dir//./_}" 

您應該使用,而不是一個for循環的進程替換一個while循環:

while IFS= read -r -d '' dir; do 
    mv -- "$dir" "${dir//./_}" 
done < <(find . -type d -maxdepth 1 -name '*.*' -print0) 

你也應該引用您的文件格式爲find

而且,因爲你只是在當前目錄遍歷目錄,您可以使用此glob

for dir in *.*/; do 
    mv -- "$dir" "${dir//./_}" 
done 
+0

('IFS ='帶'-print0')是否真的有效? – melpomene

+0

是的,它確實有效,是否有任何問題? – anubhava

相關問題