这个问题的解决方案已经困扰我好几个星期了。我正在尝试编写一个命令来仅查找一组特定目录中的全局可写文件,而无需使用-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
。)