递归的Chmod


249

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

我研究了这个线程: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 {} +

但是必须有更好的方法。


3
-r与-R不同
PJ Brunet 2014年

其他说明,如果要说使所有组权限与所有者权限匹配(似乎不太可能使IMO
陷入困境

Answers:


131

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

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

2
'\;'和有什么不一样?和命令末尾OP使用的“ +”?
kon psych 2014年

1
@konpsych显然+以不同的方式构建了命令行。我实际上并没有意识到。\;是通常的方法,每个文件有一个与搜索匹配的命令。
Fred Foo)2014年

如果某些文件的名称中包含空格,则无法使用
即将

3
@Soonts然后"{}"而不是{}应该修复它。
user4642212 '18

我在Windows 10的linux子系统下运行了它,结果却相反。大多数文件权限已删除。
Max Candocia

176

可以将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-清除的eXecutable标志foo
  • chmod +x foo-为以下项设置eXecutable标志foo
  • chmod go+x foo-与上述相同,但仅为“ 组”和“ 其他”用户设置标志,请勿触摸“ 用户(所有者)”权限
  • chmod go+X foo -与上述相同,但仅适用于目录,请勿触摸文件
  • chmod -R go+X foo-与上述相同,但是对的所有子目录进行递归操作foo

80

尝试同时更改所有权限:

chmod -R +xr

这也将对所有非目录都具有执行权限。
弗雷德·富

1
是。这只是替换了第一步。之后您仍然必须运行find -type f -exec chmod -x {} +
choroba 2012年

50

要使所有内容可由所有者写,由组读取/执行,并在世界范围内可执行:

chmod -R 0755

要使一切都敞开:

chmod -R 0777

12
添加当前文件夹位置:chmod -R 0777 .
Danijel


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.