如何在这种bash单行代码中实现并行性

时间:2019-03-23 14:02:10

标签: bash

有人可以帮我整理一下这个肮脏的单行代码并实现并行性吗?

find . -name "*.php" -exec rename 's/\.php$/.txt/' '{}' \; && chown www-data:www-data -R * && chmod 0755 -R * && find . -name "*.html" -exec rename 's/\.html$/.txt/' '{}' \; && find . -name ".htaccess" -delete

2 个答案:

答案 0 :(得分:6)

如果并行任务共享相同的I / O通道,则将并行性添加到I / O绑定的任务集只会使其变慢。 (提示:他们在这里。)

这里唯一有用的优化是减少遍历同一目录树的次数。

find . -exec chown www-data:www-data {} \; \
  -exec chmod 0755 {} \; \
  \( -name "*.php" -exec rename 's/\.php$/.txt/' '{}' \; \
  -o -name "*.html" -exec rename 's/\.html$/.txt/' '{}' \; \
  -o -name ".htaccess" -delete \)

这仍然可以调整,例如与将五个目录遍历减少为一个相比,避免将自己知道要删除的文件chown只是小土豆。

答案 1 :(得分:0)

在给您答案之前,请注意以下几点:

&&不是某种魔术组合运算符-它是逻辑AND运算符。在单行代码中,如果任何命令返回非零退出状态,则其余命令将不执行。

现在,给出答案。我添加了换行符以提高可读性,但可以安全地将其替换为空格

find . -name "*.php" -exec rename 's/.php$/.txt/' '{}' \; & \
chown www-data:www-data -R * & \
chmod 0755 -R * & \
find . -name "*.html" -exec rename 's/.html$/.txt/' '{}' \; & \
find . -name ".htaccess" -delete & \