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