有没有比使用 find 更快的方法来查找特定文件?

maz*_*azs 1 find files

我必须在文件夹中找到没有特定权限的文件 (755)。该子目录还有其他子目录,总共包含数百万个文件,而find ./ -not -perm 755命令花费的时间太长。

是否有更高效/更快的命令来执行此任务(如 ls 与 grep 结合等)?

Eig*_*ony 6

如果您使用ls -lR,则必须以某种方式从输出中排除内容,然后grep输出您想要的内容。

find可能更快。这是我的机器上的一个非常快速的 hack(grep它们很丑,我并不以此为荣)。

tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.247s
user    0m1.456s
sys     0m1.808s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.503s
user    0m0.120s
sys     0m0.380s
tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.128s
user    0m1.564s
sys     0m1.920s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.501s
user    0m0.196s
sys     0m0.428s
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 我运行了两次命令以消除缓存差异的机会
  • 您会注意到它们返回不同的计数,我的快速 hack grep 不足以仅隔离相关文件和目录条目。
  • 这样做的目的不是要向您展示更好的解决方案,而是要表明find与 raw ls+相比它非常快grep

可能有更快的解决方案,如东西perl,或作出的一种方式ls运行速度更快(设置$LANG-我的测试中刚刚出现这种撞击第二关的ls输出,你可能会说ls不是那种为好,这可能会帮助)。

编辑:我刚刚看到您的评论,您还说您需要更改权限。在这种情况下,find绝对是正确的答案,因为它可以一次性完成所有工作。

find ./ -not -perm 755 -exec chmod 755 {} \;

运行该命令时应该非常小心,以确保您位于正确的位置。一个更安全的选择是,

find /actual/full/path -not -perm 755 -exec chmod 755 {} \;

所以如果你在错误的地方,你可以避免更改系统上的每个文件。

此外,您可能应该考虑软链接、目录和非常规文件,并因此修改您的文件find。所以,假设你只关心文件,我会从,

find /actual/full/path -type f -not -perm 755 -exec chmod 755 {} \;

最后,您可能想问问自己,是否要更改一个目录或一组没有权限 755 到 755 权限的目录中每个文件的权限,那么您不需要做任何复杂的事情。

find /actual/full/path -type f -exec chmod 755 {} \;

这只会将它们全部设置为 755。它可能会更快一点(选择要更新的文件与更新数百万个文件的权限的逻辑较少,我猜这取决于已经正确的文件数量)。