Chmod recursively

253

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

我查看了这个帖子: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 {} +

但肯定有更好的方法。


3
-r与-R不相同。 - PJ Brunet
杂项说明,如果您想要让所有组权限与所有者权限匹配(在我看来似乎不太可能会出错),那是完全可行的。请参考https://serverfault.com/a/284478/210994。 - ThorSummoner
6个回答

181
你可以使用chmod命令的大写字母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` 的所有子目录进行递归操作

131

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

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

2
OP在命令的末尾使用';'和'+'有什么区别? - kon psych
1
@konpsych 显然 + 以不同的方式构建命令行。 我事实上并不知道; \; 是通常的方式,每个与搜索匹配的文件一个命令。 - Fred Foo
如果一些文件名中有空格,则无法正常工作。 - Soonts
3
йӮЈд№ҲпјҢе°Ҷ{}жӣҝжҚўдёә"{}"еә”иҜҘеҸҜд»Ҙи§ЈеҶіиҝҷдёӘй—®йўҳгҖӮ - Sebastian Simon
我在 Windows 10 上的 Linux 子系统中运行了这个程序,结果产生了相反的效果。大多数文件权限被删除了。 - Max Candocia

83

尝试同时更改所有权限:

chmod -R +xr

这将为所有非目录文件设置执行权限。 - Fred Foo
1
是的。这只是替换了第一个迭代步骤。之后仍然需要运行“find -type f -exec chmod -x {} +”。 - choroba

52

为了让所有者可以对所有内容进行写操作,让组能够读/执行,而且使得所有人都可以执行:

chmod -R 0755
为了让一切变得公开透明:
chmod -R 0777

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

19

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

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

* 注意使用了管道符(|


5

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

chmod -R 0777 ./


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接