递归地 chmod

递归地 chmod

我试图使用chmod以下文件夹和文件:

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

但我想知道:

  1. 如何在一行中使用find和排除目录...

  2. 哪种方法更好,find -exec或者xargs

答案1

是使用find还是xargs强制?

如果没有,您可以使用:

chmod -R u=rwX,go=rX *

答案2

您可以使用 chmod 的命名参数来执行此操作:

 chmod u=rwX,go=rX {}

大写X是这里的关键部分,只有当它是目录时才将权限更改为可执行。看手册页更多细节。

答案3

find . -type d -exec chmod 755 {} + -or -type f -exec chmod 644 {} +

find ... -exec ... +类似find ... -exec ... \;,只是每个大的匹配文件集仅执行一次该命令。

曾几何时,find OPTIONS... -exec COMMAND... \;必须一次只处理一个文件。 So 的xargs发明是为了对操作进行分组以提高效率。但也xargs带来了自己的麻烦:它期望以无法产生的方式引用的输入findfind OPTIONS... | xargs COMMAND...除非您知道您的文件名不包含任何空格'"\或空格,否则这是没有用的。

然后GNU发明了find OPTIONS... -print0 | xargs -0 COMMAND...,它允许任何字符出现在文件名中。但其他人花了很长时间才采用它,同时 Sun(我认为)发明了find OPTIONS... -exec COMMAND... +,它执行与 相同的分组工作xargs,但没有增加复杂性(更长的命令行,每个命令限制一个find)。现在find ... -exec ... +是标准的(它在单一 Unix v3),并且比xargs -0.除非您必须保持与旧 Linux 系统的兼容性,否则请忘记xargs.

答案4

Sherlock got (1), for (2)xargs通常更可取,因为它允许更合理的语法和更少的 shell 调用开销。请注意find 和 xargs 的-print0-0选项,因为带有空格和特殊字符的路径可能会搞砸工作。

对于一次性运行,差异实际上并不重要,除非您正在修改一棵巨大的树。如果您经常这样做以将其形式化为脚本,我会使用 xargs。

相关内容