我有以下
find
命令在 Slackware SlackBuild 脚本中的源目录上运行:
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
-o -perm 511 \) -exec chmod 755 {} \; -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
但是对于具有许多源文件的项目来说可能会非常慢。
我尝试使用 GNU Parallel 加速它,但看起来并没有更快:
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
-o -perm 511 \) | parallel --bar chmod 755
find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) | parallel --bar chmod 644
有没有办法更好地优化这个
find
命令?
对此的直接改进是将
-exec ... {} \;
替换为-exec ... {} +
(正如@pjh在评论中建议的那样,尽管没有必要将其拆分为两个find
命令)。这使得 find
对一批文件运行 chmod
命令(很像 xargs
的做法),而不是一次运行一个。创建进程(例如 chmod
子进程)的计算成本很高,而且减少次数几乎肯定会大大提高性能。
但是,如果我正确理解了情况和目标,您可以通过使用
chmod
命令的内置功能来决定何时添加执行权限,从而使其变得更简单(甚至可能更快):
chmod -R u=rwX,go=rX .
大写-
X
符号模式基本上意味着“执行权限如果有意义”(即,如果该项目是一个目录和/或已经设置了至少一个执行权限位)。
这在几个方面与您的 find
命令不
完全相同:它将在具有起始权限的文件上设置权限,而不是在
-perm
标志列表中的权限,并将权限设置为 755对于目录,即使它们最初没有设置执行权限。此外,它对于符号链接的行为可能有所不同(我不清楚原始命令中 -L
标志的目标 - 是否存在指向其操作目录之外的文件的符号链接?)。