对文件和目录应用不同的权限

对文件和目录应用不同的权限

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在它找到的文件/目录上执行命令(此处)。为此,我们可以使用-execor-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 {} +

+让我们建立更大的命令行,大大减少需要启动的进程数量。另外,它不需要\:-)

相关内容