如何使用 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。)

相关内容