我想将 chmods 应用到一行中的文件和文件夹,
基本上:
chmod 700 ./* -R # but only apply to folders
chmod 600 ./* -R # but only apply to files
当然,我搜索了谷歌并阅读了手册页。
那么问题是,以下是否有任何缺点、风险或者安全吗?
find . -type f -print0 | xargs -0 chmod 600 && find . -type d -print0 | xargs -0 chmod 700
答案1
我发现使用 ACL 还存在另一种可能性:大写的 X。给出以下结构(三个目录,三个文件):
drw------- 1/
drw------- 2/
drw------- 3/
-rw------- 4
-rw------- 5
-rw------- 6
可以设置执行,但仅适用于目录:
chmod u+X *
这将导致:
drwx------ 1/
drwx------ 2/
drwx------ 3/
-rw------- 4
-rw------- 5
-rw------- 6
find
与和相比xargs
,这具有仅需要一个命令的优点,因此不需要管道。出于这个原因,我倾向于说这更快。
在您的示例中,您基本上在一行中使用两个命令:
- 第一个搜索文件,打印它们的名称并
xargs
完成其余的工作。 - 第二个搜索目录,行为相同。
在每个调用中,您运行三个命令:
- 跑步
find
这样它就会打印出您感兴趣的文件的名称。 - 将这些名称传递给
xargs
所以它充当了一个包装器chmod
(因此,仅调用一次)。
值得注意的是,通过使用&&
,您可以确保仅当第一个命令成功时才执行第二个命令(但是,我不知道find
在您的情况下如何会失败)。
然而,当find
仅使用 ( -exec
) 时,chmod
将调用该命令每个文件符合find
标准。如果目录中有 200 个文件,chmod
则会调用 200 次,这比chmod
对 200 个文件调用一次要慢。当然,最终,由于chmod
是一个相对快速且随意的操作,因此在合理的文件数量上您不会感觉到差异。
最后,关于在程序之间传递文件名的另一个细节:空格。根据每个命令处理文件名的方式(是否使用正确的引号),您在处理名称中带有空格的文件时可能会遇到麻烦(因为这张超级图.png可以快速处理为这,极好的和图片.png)。