使用许多“-o”(布尔∨)语句优化 GNU find 命令

问题描述 投票:0回答:1

我有以下

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
命令?

bash optimization gnu-parallel slackware gnu-findutils
1个回答
0
投票

对此的直接改进是将

-exec ... {} \;
替换为
-exec ... {} +
(正如@pjh在评论中建议的那样,尽管没有必要将其拆分为两个
find
命令)。这使得
find
对一批文件运行
chmod
命令(很像
xargs
的做法),而不是一次运行一个。创建进程(例如
chmod
子进程)的计算成本很高,而且减少次数几乎肯定会大大提高性能。

但是,如果我正确理解了情况和目标,您可以通过使用

chmod
命令的内置功能来决定何时添加执行权限,从而使其变得更简单(甚至可能更快):

chmod -R u=rwX,go=rX .

大写-

X
符号模式基本上意味着“执行权限如果有意义”(即,如果该项目是一个目录和/或已经设置了至少一个执行权限位)。

这在几个方面与您的 find 命令不

完全
相同:它将在具有起始权限的文件上设置权限,而不是在
-perm
标志列表中的权限,并将权限设置为 755对于目录,即使它们最初没有设置执行权限。此外,它对于符号链接的行为可能有所不同(我不清楚原始命令中
-L
标志的目标 - 是否存在指向其操作目录之外的文件的符号链接?)。

© www.soinside.com 2019 - 2024. All rights reserved.