我必须在文件夹中找到没有特定权限(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
相比速度相当快。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。它可能会快一点(选择要更新的文件与更新数百万个文件的权限相比,逻辑较少,我猜这取决于已经正确的文件数量)。
答案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。