为大量文件/目录设置访问权限的最快方法?

Fastest way to set access permissions for a large number of files / directories?

提问人:bproxauf 提问时间:7/17/2023 最后编辑:bproxauf 更新时间:7/17/2023 访问量:148

问:

我想为大量文件和目录设置访问权限。在如何提高更改文件和文件夹权限的性能?和 https://superuser.com/a/91938/813482 中,介绍了用于设置权限的几种变体,其中包括:

变式1:

find /path/to/base/dir -type d -exec chmod 755 {} +
find /path/to/base/dir -type f -exec chmod 644 {} +

变式2:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

变式3:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

以下哪一项应该是最有效的?在对我使用的目录的快速测试中,与变体 1 相比,变体 2 将时间从 30 多秒减少到 3 秒以上(一个数量级),因为它不需要单独调用每个文件。变体 3 发出了警告,因为某些目录名称/文件名包含空格,并且无法访问这些目录。变体 3 甚至可能比变体 2 略快,但我不确定,因为这可能与无法进入目录(?chmod

性能 shell 文件权限 chmod

评论


答:

1赞 KamilCuk 7/17/2023 #1

以下哪一项应该是最有效的?

变式1.

我你真的想要速度,穿越一次,而不是两次。

find /path/to/base/dir '(' -type d -exec chmod 755 {} + ')' -o '(' -type f -exec chmod 644 {} + ')'

如果文件或目录的数量大于平台上的最大参数数,则变体 2 非常有用。

变体 3 非常糟糕,其中 find 的结果没有引用,shell 会进行分词和文件名扩展。例如,如果任何路径具有空间或星形,它将严重失败。

评论

0赞 bproxauf 7/17/2023
我可以看到遍历一次的速度优势。但是,与遍历两次的变体 1 相比,变体 2 在遍历两次时更快。遍历一次的变体 2 不应该更快吗?
0赞 KamilCuk 7/17/2023
您测试了数百万个文件?即我质疑测量方法。另外,我怀疑您在版本 1 之后测试了版本 2,这意味着路径在缓存中。
0赞 bproxauf 7/17/2023
该目录大约有 10400 个文件和 2800 个目录。你是对的,因为我在变体 2 之后运行了变体 1。无论如何,您的解决方案(0.83s)确实比变体2(0.70 + 2.77 = 3.47s)更快。