如何递归chmod除文件之外的所有目录?

Oli*_*nde 680 permissions chmod

如何 chmod 755 所有目录但没有文件(递归)?

相反,如何仅 chmod 文件(递归)但没有目录?

nik*_*nik 947

递归地赋予目录读取和执行权限:

find /path/to/base/dir -type d -exec chmod 755 {} +
Run Code Online (Sandbox Code Playgroud)

要递归地授予文件读取权限:

find /path/to/base/dir -type f -exec chmod 644 {} +
Run Code Online (Sandbox Code Playgroud)

或者,如果有很多对象要处理:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Run Code Online (Sandbox Code Playgroud)

或者,为了减少chmod产卵:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
Run Code Online (Sandbox Code Playgroud)

  • 对于文件过多的目录,前两个示例失败:`-bash: /bin/chmod: Argument list too long`。最后一个命令适用于许多文件,但是当使用 `sudo` 时,必须小心将它放在 xargs 而不是 chmod 之前: `find /path/to/base/dir -type d -print0 | 须藤 xargs -0 chmod 755` (13认同)
  • 我认为就文件名中的空格和符号以及文件数量而言,最正确(但不是最快)的版本是`find /path/to/base/dir -type d -exec chmod 755 {} \;`(`find / path/to/base/dir -type f -exec chmod 644 {} \;`)。 (9认同)
  • `chmod ... $(find /path/to/base/dir -type ...)` 对于名称中有空格的文件名失败。 (4认同)
  • 还要注意,这些命令*包括*基本目录。所以在上面的例子中,`dir` 也将被设置为 755。 (3认同)
  • find exec 之后 plus 做什么?[事实证明](/sf/answers/425966621/) 它使“find”使用所有参数运行“chmod”一次,而不是分别对每个文件名运行多次 (2认同)

bob*_*nce 336

这种事情的一个常见原因是将目录设置为 755,而将文件设置为 644。在这种情况下,有一种比 nik 的find示例稍微快一点的方法:

chmod -R u+rwX,go+rX,go-w /path
Run Code Online (Sandbox Code Playgroud)

意义:

  • -R = 递归;
  • u+rwX = 用户可以读、写和执行;
  • go+rX = group 和其他人可以读取和执行;
  • go-w =组和其他人不能写

这里要注意的重要一点是大写X与小写的作用不同x。在手册中,我们可以阅读:

如果文件是目录,则执行/搜索位或任何执行/搜索位设置为原始(未修改)模式。

换句话说,文件上的 chmod u+X 不会设置执行位;并且 g+X 只会在已经为用户设置的情况下设置它。

  • 当有人执行 `chmod -R 777` 时,这种模式不会解决这种情况,因为 `+X` 选项不会重置文件上的现有执行位。使用 -x 将重置目录,并防止进入它们。 (28认同)
  • `go+rX,go-w` -> `go=rX` 不是吗? (10认同)
  • 您还可以组合使用 `chmod ux,u+X` 等,以删除文件的执行位,但为目录添加它们。 (8认同)
  • -R = 递归;u+rwX = 用户可以读、写和执行;go+rX = group 和其他人可以读取和执行;go-w = 群和其他人不能写 (5认同)
  • @ring0:我不打算按字面意思回答这个问题 - nik 已经做得很好了。我为最常见的情况指出了一个更便宜的解决方案。是的,如注释中所述,您确实使用“X”获得了对文件和目录的不同权限。 (4认同)

小智 16

如果要确保文件设置为 644 并且路径中有文件具有执行标志,则必须先删除执行标志。+X 不会从已经拥有它的文件中删除执行标志。

例子:

chmod -R ugo-x,u+rwX,go+rX,go-w path
Run Code Online (Sandbox Code Playgroud)

更新:这似乎失败了,因为第一次更改 (ugo-x) 使目录无法执行,因此它下面的所有文件都没有更改。

  • 这对我有用,但我不明白为什么不起作用。 (当然,如果您只执行了“chmod -R ugo-x path”,这可能是一个问题。但是完整的命令将在尝试下降到每个目录之前对每个目录执行“chmod u+rwX”。)但是,我相信“chmod R u=rw,go=r,a+X path”就足够了——而且它更短。 (2认同)

Pet*_*r K 7

要递归地授予目录读取和执行权限:

find /path/to/base/dir -type d -exec chmod 755 {} \;
Run Code Online (Sandbox Code Playgroud)

要递归地授予文件读取权限:

find /path/to/base/dir -type f -exec chmod 644 {} \;
Run Code Online (Sandbox Code Playgroud)

迟到总比不让我升级尼克的答案的正确性更好。我的解决方案速度较慢,但​​它适用于任意数量的文件,文件名中包含任何符号,并且您可以正常使用 sudo 运行它(但请注意,它可能会使用 sudo 发现不同的文件)。