Linux
如果路徑中有空格,如何刪除目錄的內容?
find -name "lastStable" -o -name "lastSuccessful" -exec sh -c "sudo rm -rv {}/*" {} \;
正如您從上面的命令中看到的那樣,我正在檢查並刪除
lastStable
和lastSuccessful
目錄的內容,但將這些文件夾留在後面。但是,在 中find
,我最終可能會得到帶有空格的路徑,例如:/promotions/Production Development Environment/lastStable
如何讓我的 find 腳本也處理這些路徑中的空格?
請參閱之前的 unix.se 問題:“是否可以
find -exec sh -c
安全使用?” .目前嘗試失敗的原因是它直接將匹配的文件路徑替換為
sh -c
; 因此,如果匹配的文件路徑是“/promotions/Production Development Environment/lastStable”,它將執行相當於:sh -c "sudo rm -rv /promotions/Production Development Environment/lastStable/*" '/promotions/Production Development Environment/lastStable'
(路徑包含兩次,因為
{}
在-exec
.sudo rm -rv '/promotions/Production' 'Development' 'Environment/lastStable'/*
…這根本不是你想要的。
但請注意,字元串中第二次出現的
{}
沒有-exec
得到分詞,您可以利用這一點:find -name "lastStable" -o -name "lastSuccessful" -exec sh -c 'sudo rm -rv "$0"/*' {} \;
注意
"$0"
instead of{}
(因此shell 將進行替換並且不進行分詞),以及子命令周圍的單引號(因此$0
在傳遞給shell 之前不會被解釋)。這相當於:sh -c 'sudo rm -rv "$0"/*' '/promotions/Production Development Environment/lastStable'
然後 shell 替換
$0
為 shell 命令的下一個參數,給出:sudo rm -rv "/promotions/Production Development Environment/lastStable"/*
這(據我所知)正是您想要的。