我试图使用chmod
以下文件夹和文件:
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
但我想知道:
如何在一行中使用
find
和排除目录.
和..
哪种方法更好,
find -exec
或者xargs
?
答案1
是使用find
还是xargs
强制?
如果没有,您可以使用:
chmod -R u=rwX,go=rX *
答案2
答案3
find . -type d -exec chmod 755 {} + -or -type f -exec chmod 644 {} +
find ... -exec ... +
类似find ... -exec ... \;
,只是每个大的匹配文件集仅执行一次该命令。
曾几何时,find OPTIONS... -exec COMMAND... \;
必须一次只处理一个文件。 So 的xargs
发明是为了对操作进行分组以提高效率。但也xargs
带来了自己的麻烦:它期望以无法产生的方式引用的输入find
。find 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。