253

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

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

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

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

这些只是我迄今为止发现的少数几个,但可能更多。

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

即我现在是怎么做的:

做:

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

直到我没有错误,然后

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

但必须有更好的方法。

4

6 回答 6

179

您可以使用带有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- 清除可执行标志foo
  • chmod +x foo- 设置可执行标志foo
  • chmod go+x foo- 同上,但只为其他用户设置标志,不要触摸用户(所有者)权限
  • chmod go+X foo- 同上,但只适用于目录,不要碰文件
  • chmod -R go+X foo- 与上面相同,但递归地对所有子目录执行此操作foo
于 2012-11-14T11:36:26.057 回答
131

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

find . -type d -exec chmod +rx {} \;
于 2012-11-14T11:23:20.183 回答
82

尝试同时更改所有权限:

chmod -R +xr
于 2012-11-14T11:20:11.187 回答
51

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

chmod -R 0755

让一切都敞开:

chmod -R 0777
于 2015-03-02T07:07:43.557 回答
18

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

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

* 注意管道 ( |)

于 2016-07-14T07:50:16.203 回答
3

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

chmod -R 0777 ./

于 2019-02-01T13:22:27.547 回答