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

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

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

是否有更有效/更快的命令来完成此任务(例如 ls 与 grep 等组合)?

答案1

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

find可能会更快。这是对我的机器的一个非常快速的破解(它们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

一些注意事项:

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

可能有更快的解决方案,例如 中的某些内容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。它可能会快一点(选择要更新的文件与更新数百万个文件的权限相比,逻辑较少,我猜这取决于已经正确的文件数量)。

答案2

如果您的目的是使所有文件和目录都具有 755 权限,您可以简单地执行递归 chmod:

chmod -R 755 $directory

如果您需要文件为模式 644,您可能会更好

chmod -R u=rwX,go=rw $directory

这将使用单个进程来查找必要的文件并在必要时更新其权限。


如果您因其他原因需要查找具有不同权限的文件,那么这find将是您的最佳选择。

答案3

如果您安装了 mlocate,那么这会更容易,但前提是您知道部分文件名。另外,除非您对 mlocate.db 文件进行权限更改,否则它需要 root 权限。

安装后,应定期运行 cron 作业来更新 mlocate 数据库,或者您可以运行 Updatedb 来手动执行此操作。一旦那里使用命令locate。

相关内容