Linux

如果路徑中有空格,如何刪除目錄的內容?

  • July 17, 2018
find -name "lastStable" -o -name "lastSuccessful" -exec sh -c "sudo rm -rv {}/*" {} \; 

正如您從上面的命令中看到的那樣,我正在檢查並刪除lastStablelastSuccessful目錄的內容,但將這些文件夾留在後面。但是,在 中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"/*

這(據我所知)正是您想要的。

引用自:https://serverfault.com/questions/711379