![对文件和目录应用不同的权限](https://linux22.com/image/36793/%E5%AF%B9%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95%E5%BA%94%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E6%9D%83%E9%99%90.png)
Sunny回答了上面的问题这个帖子,答案给出为
不需要脚本。
// 目录:
find . -type d -exec chmod XXX {} \;
// 文件:
find . -type f -exec chmod XXX {} \;
您能用通俗语言解释一下吗?
我真的不喜欢不明原因的{}
标记,\
而且也不太关心它们;
!
我一直在尝试学习 Linux cli / bash / shell 等内容并进行谷歌搜索等,以找到答案,并且在大多数情况下它运行良好,除非发生上述情况。
答案1
是{}
一个占位符,表示找到匹配的文件。这是告诉传递给 exec 参数的命令哪些文件找到匹配的方法。
终止;
用于 exec 参数的命令。只是\
为了转义,;
因此它不会被执行 shell 解析(;
通常用于分隔要顺序执行的多个命令)。您可以轻松地以其他方式引用它:
find . -type d -exec chmod XXX '{} ;'
find . -type f -exec chmod XXX '{} ;'
您也可以使用 + 代替 ;。这将导致 find 将每个匹配项追加到一个列表中,并将它们全部传递给一个子进程(而不是生成一个新的子进程来在每个匹配项的 exec 参数中运行命令)。 (注意:如果您有大量匹配项,使用 + 可能会导致您收到有关命令太长的错误)。
find . -type d -exec chmod XXX {} +
find . -type f -exec chmod XXX {} +
答案2
.
= 当前目录,即。搜索当前目录及其下面的任何目录。要搜索主目录,请使用/home
.要搜索您的主目录,请使用~/
.要搜索用户“foo”的目录,请使用~foo/
.寻找一切从根向下,使用/
.
注意!:申请权限!如果您无权下降到某个目录(例如另一个用户的主目录),那么find
也无法执行此操作!这根-用户没有这种愚蠢的限制,但“能力越大,责任越大”。
-type d|f
= 告诉 find 查看某种“类型”的文件,例如。文件、目录、套接字、符号链接、命名管道……。 Af
指定您要查找的类型是文件,而 ad
指定您要find
返回目录。
通常find
只会列出它找到的文件,这是隐式-print
指令。然而,在这里,我们希望 findchmod
在它找到的文件/目录上执行命令(此处)。为此,我们可以使用-exec
or-ok
指令。 -ok
在执行命令之前会首先询问您“是”或“否”。
要执行的命令从紧随其后开始-exec
并一直持续到find
遇到;
(分号)为止。不幸的是,分号对于 shell(bash
和其他)也有特殊的含义 - shell 使用它来将命令组合在一行上(例如command1 ; command2
)。所以我们必须“引用”分号,这样 shell 之前就不会“看到”它find
。 shell 接受三种引用形式:双引号 ("...") 和单引号 ('...') 通常用于字符串 - 我们可以使用其中任何一种来引用分号。但是,当您只想像这里这样引用单个字符时,更常见的是使用第三种引用形式 - 反斜杠 (\)。结果是\;
. (如果您将find
- 命令放入文件中 - 即创建一个脚本 - 您通常可以放弃 -\;
并仅使用 - ;
,因为 shell 不会像处理命令行那样扩展脚本。)
通常我们想要执行的命令需要找到 find
文件名。用作找到的文件名的占位符。通常,最好将占位符放在引号中 - - 以确保命令将包含空格的文件名视为单个文件名。find
{}
"{}"
对于我发现chmod u=rw,go=r {}
orchmod u=rw,go= {}
效果最好的文件,而目录应该使用chmod u=rwx,go=rx {}
or chmod u=rwx,go= {}
(取决于您的偏执程度)。
答案3
我真的不喜欢无法解释的 {} 和 \ 标记,并且不太关心 ;任何一个!
或者,如果 {} 和 \;太麻烦了,还有一个替代方法。此外,此方法比 find ... -exec 公式更好地处理文件名中的空格。
find . -type d -print0 | xargs -0 chmod MASK
find . -type f -print0 | xargs -0 chmod MASK
find 命令的 -print0 创建一个以 null 结尾的字符串列表。 xargs 处理列表,-0 表示它必须在以 null 结尾的字符串上拆分。
此外,在某些情况下,此表述比 find 命令的 -exec 参数更快。这里有一些讨论:https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
-print0 也可能仅适用于 Linux,而不是一般的 Unix。
答案4
让我简单介绍一下\;
:
\;
命令的分隔符-exec
将为find
每个找到的文件启动一个新进程。现在想象一下在包含 100,000 个文件的目录树上运行它......
如果您运行这样的命令chmod XXX ...
,可以在一次运行中处理/许多/文件,那么您的表现会更好
find <base> <conditions> -exec chmod xxx {} +
+
让我们建立更大的命令行,大大减少需要启动的进程数量。另外,它不需要\
:-)