【问题标题】:Chmod recursively递归地chmod
【发布时间】:2012-11-02 21:03:18
【问题描述】:

我有一个存档,由其他人存档,我想在下载后自动更改提取文件中的文件系统分支以获得读取权限。 (我无法更改存档的创建方式)。

我已经研究过这个帖子:chmod: How to recursively add execute permissions only to files which already have execute permission 和其他一些帖子一样,但没有任何乐趣。

这些目录最初带有多个但都是错误的标志,它们可能显示为:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

这些只是我目前发现的少数几个,但可能更多。

find 在尝试查看没有x 权限的目录时出错,因此不会将其传递给chmod。到目前为止,我一直在做的是手动更改父目录的权限,然后进入子目录并为它们做同样的事情等等。但这是很多手工劳动。没有办法自动执行此操作吗?

即我现在是怎么做的:

做:

$ chmod -R +x
$ chmod -R +r

直到我没有错误,然后

$ find -type f -exec chmod -x {} +

但一定有更好的办法。

【问题讨论】:

  • -r 与 -R 不同
  • 杂项说明,如果您想说让所有组权限与所有者权限匹配(似乎不太可能将所有内容都搞砸 IMO)serverfault.com/a/284478/210994

标签: linux shell find chmod


【解决方案1】:

将 0777 赋予从当前路径开始的所有文件和目录:

chmod -R 0777 ./

【讨论】:

    【解决方案2】:

    使所有内容都可由所有者写入,由组读取/执行,以及世界可执行:

    chmod -R 0755
    

    让一切都敞开:

    chmod -R 0777
    

    【讨论】:

    • 添加当前文件夹位置:chmod -R 0777 .
    【解决方案3】:

    将可执行权限递归添加到当前文件夹中带有sh扩展名的所有文件(不是文件夹):

    find . -name '*.sh' -type f | xargs chmod +x

    * 注意pipe (|)

    【讨论】:

      【解决方案4】:

      您可以使用带有X 模式字母(大写X)的chmod 来设置仅为目录的可执行标志。

      在下面的示例中,可执行标志被清除,然后递归地为所有目录设置:

      ~$ mkdir foo
      ~$ mkdir foo/bar
      ~$ mkdir foo/baz
      ~$ touch foo/x
      ~$ touch foo/y
      
      ~$ chmod -R go-X foo 
      ~$ ls -l foo
      total 8
      drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
      drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
      -rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
      -rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y
      
      ~$ chmod -R go+X foo 
      ~$ ls -l foo
      total 8
      drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
      drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
      -rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
      -rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y
      

      一点解释:

      • chmod -x foo - 清除 fooeXecutable 标志
      • chmod +x foo - 为 foo 设置 eXecutable 标志
      • chmod go+x foo - 同上,但只为 GroupOther 用户设置标志,不要触摸 User(所有者)权限
      • chmod go+X foo - 同上,但只适用于目录,不要碰文件
      • chmod -R go+X foo - 与上述相同,但对foo 的所有子目录递归

      【讨论】:

        【解决方案5】:

        除了执行权限之外,您还需要读取权限才能列出目录。如果您只有执行权限,那么您可以找到目录中条目的名称,但没有其他信息(甚至没有类型,所以您不知道哪些条目是子目录)。这对我有用:

        find . -type d -exec chmod +rx {} \;
        

        【讨论】:

        • '\;'有什么区别以及 OP 在命令末尾使用的“+”?
        • @konpsych 显然+ 以不同的方式构建命令行。我实际上并没有意识到这一点。 \; 是通常的方式,每个文件有一个与搜索匹配的命令。
        • 如果某些文件的名称中有空格则不起作用
        • @Sonts 然后"{}" 而不是{} 应该修复它。
        • 我在 Windows 10 的 linux 子系统下运行它,但效果相反。大多数文件权限已被删除。
        【解决方案6】:

        尝试同时更改所有权限:

        chmod -R +xr
        

        【讨论】:

        • 这也会对所有非目录赋予执行权限。
        • 是的。这只是替换了第一个迭代步骤。之后你仍然需要运行find -type f -exec chmod -x {} +
        猜你喜欢
        • 2013-07-08
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2012-04-17
        • 1970-01-01
        • 2015-08-24
        • 1970-01-01
        相关资源
        最近更新 更多