Chmod递归

我有一个归档文件,它是由其他人存档的,我想在下载它之后自动地在提取的文件中更改文件系统的一个分支,以获得读访问权。(我不能改变档案的创建方式)。

我已经研究了这个线程:chmod:如何递归地为已经具有执行权限的文件添加执行权限和其他一些线程一样,但没有乐趣。

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

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

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

当试图查找没有x权限的目录时,find错误,因此不会将其传递给chmod。到目前为止,我所做的是手动更改父目录的权限,然后进入子目录并对它们执行相同的操作,等等。但这需要大量的手工劳动。有没有什么方法可以自动做到这一点?

例如,我现在是怎么做的:

做的事:

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

直到没有错误为止

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

但肯定有更好的办法。

530185 次浏览

尝试同时更改所有权限:

chmod -R +xr

除了执行访问外,还需要读访问来列出目录。如果您只有执行访问权,那么您可以找到目录中条目的名称,但不能找到其他信息(甚至不包括类型,因此您不知道哪些条目是子目录)。这对我来说很管用:

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

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

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

~$ 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 -清除foo可执行的标志
  • chmod +x foo -为foo设置可执行的标志
  • chmod go+x foo -与上面相同,但仅为集团其他用户设置标志,不要触及用户(所有者)权限
  • chmod go+X foo -与上面相同,但只适用于目录,不涉及文件
  • chmod -R go+X foo -与上面相同,但对foo的所有子目录执行递归地

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

chmod -R 0755

使一切敞开:

chmod -R 0777

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

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

*注意管(|)

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

chmod -R 0777 ./