仅将递归 chmod 应用于文件或文件夹

仅将递归 chmod 应用于文件或文件夹

我想将 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)。

相关内容