我必须在文件夹中找到没有特定权限的文件 (755)。该子目录还有其他子目录,总共包含数百万个文件,而find ./ -not -perm 755命令花费的时间太长。
是否有更高效/更快的命令来执行此任务(如 ls 与 grep 结合等)?
如果您使用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)
一些注意事项:
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。它可能会更快一点(选择要更新的文件与更新数百万个文件的权限的逻辑较少,我猜这取决于已经正确的文件数量)。