Find

為什麼“find -delete”意味著“-depth”?

  • January 8, 2022

GNU 的手冊頁find清楚地警告說 using-delete暗示-depth. 但是,我找不到對此要求的任何解釋:

**-delete**刪除文件; 如果刪除成功,則為 true。如果刪除失敗,則會發出錯誤消息。

$$ … $$使用-delete自動打開該-depth選項。

find --version
find (GNU findutils) 4.8.0

這隱含地是一個後序遍歷:

find /path -type f -delete

但這是一個前序遍歷,通常的遍歷方法find

find /path -type f -exec rm -f {} +

如果我想使用-prune我不能使用-delete,我必須使用更麻煩-exec rm {} +的,但最終效果似乎是一樣的。

-delete操作不會刪除目錄,那麼為什麼find -delete需要暗示-depth

-delete操作不會刪除目錄,那麼為什麼 find-delete需要暗示-depth

對於 GNU 實用程序,參考文件是實用程序的資訊文件,而不是它們的手冊頁;正如在某些情況下發生的那樣,問題中引用的手冊頁具有誤導性。find -delete可以刪除目錄

刪除文件或目錄;如果刪除成功,則為 true。如果刪除失敗,則會發出錯誤消息。

-delete``find自2004 年(findutils4.2.3)在 GNU 中引入以來,一直支持刪除目錄。

刪除目錄的原因是-delete-depth它只能刪除以前清空過的目錄。-deleteon 目錄等價於rmdir,而不是rm -rf.

find /path -type f -delete和的最終效果find /path -type f -exec rm -f {} +是相同的,因為兩個find呼叫都將它們的操作限制在文件中。由於只刪除文件,因此刪除它們的順序對find’ 的遍歷沒有影響。刪除目錄時,find的遍歷確實起作用。如果-delete在目錄上使用 ,則必須先處理完目錄的所有子目錄,然後才能刪除目錄本身;這-depth是有用的地方。如果rm -rf在被遍歷的目錄上使用,則find必須在嘗試遍歷已刪除目錄的子目錄之前告知刪除;這是一個-prune有用的例子。

可以想像對它進行特殊處理,以便它不會設置-depth是否不刪除目錄,但在一般情況下無法提前確定。(-depth是一個選項,而不是一個動作;它需要在實際處理第一個動作之前設置。)

或者,正如過去提出的那樣,可以想像根本沒有任何特殊處理-delete,並讓使用者負責確保-delete在必要時可以完成其工作。但是,這會破壞向後兼容性以及與已複製的其他實現的兼容性-delete。另見Savannah bug #20865 中的討論

GNU從 4.3.11 版本開始findutils 顯式檢查-delete組合 with-prune-depth ,如果沒有顯式設置則中止。評論指出

我們只能僥倖逃脫,因為-delete謂詞不在 POSIX 中。如果是這樣,我們就不能在這裡發出致命錯誤。

正如在為什麼 find with -delete 刪除我的 /save/ 目錄中的文件時所討論的,當 find without delete 無法找到它們時?,如果您使用的是 GNU find,則應該-execdir rm {} +使用-exec rm {} +.

引用自:https://unix.stackexchange.com/questions/685551