如何使用 find 指令列出目錄中的全域可寫檔案而不遍歷任何子目錄?

如何使用 find 指令列出目錄中的全域可寫檔案而不遍歷任何子目錄?

這個問題的解決方案已經困擾我好幾個星期了。我正在嘗試編寫一個命令來僅查找一組特定目錄中的全域可寫文件,而無需使用-prune.

我嘗試了多種不同的選擇,結果只剩下

find / -type f -perm -2

然而,這仍然會遍歷到子目錄。使用命令

find / -prune -type f -perm -2

也沒有結果。我這哪裡出錯了?

答案1

嘗試使用maxdepth N

-最大深度級別
下降到起始點以下的大多數等級(非負整數)目錄等級。 -maxdepth 0 表示僅將測試和操作應用於起點本身。

find $FOLDER -maxdepth 1 -perm -2

答案2

find / -type f -perm -2

這是遞歸的。就是這樣find

find / -prune -type f -perm -2

在這裡,您指示find應用-prune到它找到的所有內容。條件和動作是從左到右處理的;由於之前沒有條件-prune,因此無條件應用。因此,找到的第一件事find(即命令列參數/)已-prune應用於它,因此find不會遍歷目錄的內容。由於/不符合以下條件,因此不會列印。

要僅處理頂級目錄的條目,您需要套用到-prune目錄除了命令列參數。執行此操作的可移植方法是/.在命令列上傳遞的路徑末尾使用。這會導致find將它們的名稱視為.,因此您可以使用-name .它們來匹配它們。在遞歸遍歷中,.由於該名稱被保留,因此不會呼叫任何檔案。現在有三種不同的情況:

  • 頂級目錄:遞迴。
  • 其他目錄:不遞迴。
  • 世界可寫的常規文件:列印。

若要指定幾種不同的行為,請使用-o(“或”)運算子。所有條件都符合的第一個適用。

find /. -name . -o -type d -prune -o -type f -perm -2 -print

有些版本find允許您編寫find / -name / -o -type d -prune -o …,但有些則不允許(例如 BusyBox)。

某些版本find支援選項-mindepth-maxdepth限制遞歸遍歷。如果您的發現支持它,您可以使用它來代替-prune.

find / -mindepth 1 -maxdepth 1 -type f -perm -2

-mindepth-maxdepth是全域選項,條件和操作部分帶有-type f -perm -2隱式尾隨-print。)

相關內容