我不小心將目錄中的資料夾複製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 套用../
。
筆記:
-maxdepth 1
和的順序-type d
相反,因為man find
建議-maxdepth
在位置選項(如 )之前定義全域選項(如 )-type
。shell 指令必須用單引號括起來:
'rm -r "../$1"'
。如果它用雙引號括起來,則原始 shell 會將其值替換為$1
,並且 找到的目錄名稱find
將被忽略。我們需要被呼召的人sh
來代替。字串"../$1"
用雙引號括起來,以保護目錄名$1
免遭分詞和路徑名擴展。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 -- "$@"
但與上述的一個區別是,它還將包含目錄的符號連結(並且會刪除目標的內容而不是連結本身)。