如何根據“find”輸出刪除目錄:僅第一個結果

如何根據“find”輸出刪除目錄:僅第一個結果

基於這個問題,

如何根據“find”輸出刪除目錄?

我嘗試僅刪除結果的第一個資料夾:

find * -type d | head -n1 | -exec rm -rf {} \;

但我收到此錯誤:

bash: -exec: command not found

怎麼了?

答案1

您可以-quit在使用-delete或後使用-exec

-辭職
立即退出。不會有子進程繼續運行,但不會再處理命令列上指定的路徑。


刪除命令的第一個結果find

find * -type d -exec rm -Rf {} \; -quit

或者

find . ! -path . -type d -exec rm -Rf {} \; -quit

後者會找到隱藏的資料夾。


請注意,您的查找輸出可能不按字母順序排序

對於排序後刪除第一個結果:

find * -maxdepth 1 -type d -print0 | sort -z | head -zn1 | xargs -r0 rm -Rf

對於數字排序,請使用sort -zn.

答案2

pLumo充分給出了一些很好的替代解決方案在他們的回答中。我提供了一種完全不同的方法。

您會注意到該find命令,即您使用它來*描述頂級搜尋路徑的方式,僅真正用於*尋找擴展為的名稱中的第一個目錄

您也可以使用 shell 循環來執行此操作,這會使程式碼更易於閱讀並了解其作用:

shopt -s dotglob nullglob

for name in *; do
    if [ -d "$name" ] && [ ! -h "$name" ]; then
        rm -rf -- "$name"
        break
    fi
done

這個循環假設它在bashshell 中運行,迭代所有匹配的名稱*(包括隱藏名稱)。循環體測試目前名稱是否為目錄(不是目錄的符號連結),如果是,則在退出循環之前遞歸刪除該目錄。

zsh使用更簡單的指令可以在 shell 中產生類似的效果

rm -rf -- *(D/[1])

這將刪除擴展到的第一個目錄*。通配限定符將(D/[1])的符合限制*為僅目錄 ( /),但包括隱藏名稱 ( D),並且僅傳回第一個符合名稱 ( [1])。如果目前目錄中沒有目錄,您會從 shell 收到「未找到符合項目」的錯誤訊息。

答案3

這看起來很危險,但你可以嘗試:

find * -type d | head -n1 | xargs rm -rf

答案4

對我來說這段程式碼有效:

  • 僅查找帶有 -type f 的文件,
  • 過濾不包含“.gz”的文件
  • 在本例中選擇 N 個文件,僅選擇第一個 -n 1

代碼:

尋找 。 -輸入f! -名稱“*.gz”|頭 -n 1 | xargs rm -rf {} ;

相關內容