Chmod递归

237 linux shell find chmod

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

我查看了这个帖子:chmod:如何递归地将执行权限添加到已经具有执行权限的文件中,而不是其他一些文件,但没有快乐.

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

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--
Run Code Online (Sandbox Code Playgroud)

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

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

即我现在是怎么做的:

做:

$ chmod -R +x
$ chmod -R +r
Run Code Online (Sandbox Code Playgroud)

直到我没有错误,然后

$ find -type f -exec chmod -x {} +
Run Code Online (Sandbox Code Playgroud)

但必须有更好的方法.

Dmi*_*nov 169

您可以将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
Run Code Online (Sandbox Code Playgroud)

一点解释:

  • chmod -x foo- 清除eXecutable标志foo
  • chmod +x foo- 设置eXecutable标志foo
  • chmod go+x foo- 与上述相同,但仅为GroupOther用户设置标志,请勿触摸User(所有者)权限
  • chmod go+X foo - 与上述相同,但仅适用于目录,请勿触摸文件
  • chmod -R go+X foo- 与上面相同,但对于所有子目录递归执行此操作foo

  • 这比接受的答案要好! (9认同)
  • 介意:吹.谢谢! (2认同)

Fre*_*Foo 126

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

find . -type d -exec chmod +rx {} \;
Run Code Online (Sandbox Code Playgroud)

  • '\;' 和有什么不一样 以及 OP 在命令末尾使用的“+”? (2认同)
  • @Soonts然后应该用“” {}“`而不是`{}`来解决它。 (2认同)

cho*_*oba 78

尝试同时更改所有持久性:

chmod -R +xr
Run Code Online (Sandbox Code Playgroud)


小智 49

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

chmod -R 0755
Run Code Online (Sandbox Code Playgroud)

让一切都敞开:

chmod -R 0777
Run Code Online (Sandbox Code Playgroud)

  • 添加当前文件夹位置:`chmod -R 0777 .` (10认同)

Ali*_*aka 14

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

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

*注意管道(|)


Ant*_*nay 5

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

chmod -R 0777 ./