為什麼“find -delete”意味著“-depth”?
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 年(findutils
4.2.3)在 GNU 中引入以來,一直支持刪除目錄。刪除目錄的原因是
-delete
:-depth
它只能刪除以前清空過的目錄。-delete
on 目錄等價於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 {} +
.