find 指令:在路徑中使用 {}

find 指令:在路徑中使用 {}

我不小心將目錄中的資料夾複製Music到了父michal目錄中。我想一舉刪除這些目錄。

有什麼辦法可以完成以下工作嗎?或有更好的選擇嗎?

/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;

顯然{}沒有被替換,因為上面返回

rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...

答案1

你的find命令對我來說 GNU 運作得很好find。如果它在您的系統上不起作用,請嘗試:

find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;

此方法用作{}獨立參數,未經 修改../。我們將 的值傳遞{}給 shell,然後 shell 套用../

筆記:

  1. -maxdepth 1和的順序-type d相反,因為man find建議-maxdepth在位置選項(如 )之前定義全域選項(如 ) -type

  2. shell 指令必須用單引號括起來:'rm -r "../$1"'。如果它用雙引號括起來,則原始 shell 會將其值替換為$1,並且 找到的目錄名稱find將被忽略。我們需要被呼召的人sh來代替。字串"../$1"用雙引號括起來,以保護目錄名$1免遭分詞和路徑名擴展。

  3. shell 將字串分配Rm$0.除非出現錯誤訊息,否則不會使用此選項。因此,可以使用任何字串。

答案2

zsh

cd /home/michal &&
rm -rf -- Music/*(/D:t)

glob/限定符是只選擇目錄,D包括隱藏的目錄,而:t歷史擴充中的修飾符是只選擇尾巴(不含目錄部分的檔案名稱)。

對於任何類似 Bourne 的 shell:

cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"

但與上述的一個區別是,它還將包含目錄的符號連結(並且會刪除目標的內容而不是連結本身)。

相關內容