Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 递归Chmod_Linux_Shell_Find_Chmod - Fatal编程技术网

Linux 递归Chmod

Linux 递归Chmod,linux,shell,find,chmod,Linux,Shell,Find,Chmod,我有一个存档文件,它是由其他人存档的,我想在下载它之后,自动更改提取文件中的文件系统分支以获得读取权限。(我无法更改归档文件的创建方式) 我研究过这条线索:就像研究其他一些线索一样,但没有乐趣 目录最初带有多个但全部错误的标志,它们可能显示为: drwx------ d---r-x--- drwxrwxr-x dr--r-xr-- 这些只是我迄今为止发现的少数,但可能更多 find尝试查找没有x权限的目录时出错,因此不会将其传递给chmod。到目前为止,我一直在做的是手动更改父目录上的权限,然

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

我研究过这条线索:就像研究其他一些线索一样,但没有乐趣

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

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--
这些只是我迄今为止发现的少数,但可能更多

find
尝试查找没有
x
权限的目录时出错,因此不会将其传递给
chmod
。到目前为止,我一直在做的是手动更改父目录上的权限,然后进入子目录并对它们执行相同的操作,以此类推。但这需要大量的体力劳动。难道没有办法自动做到这一点吗

即,我现在是如何做的:

做:

直到我没有错误,然后

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

但必须有更好的方法。

尝试同时更改所有任务:

chmod -R +xr

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

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-名称'*.sh'-类型f | xargs chmod+x


*请注意,

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

chmod-R0777/


这也将在所有非目录上设置执行权限。是。这只是替换了第一个迭代步骤。之后还必须运行
find-typef-execchmod-x{}+
而OP在命令末尾使用的“+”?@konpsych显然以不同的方式构建命令行。我实际上没有意识到这一点<代码>\是通常的方式,每个文件都有一个与搜索匹配的命令。如果某些文件中有空格,则不起作用name@Soonts然后,
“{}”
而不是
{}
应该修复它。我在Windows 10上的linux子系统下运行了此操作,结果适得其反。大多数文件权限已被删除。-r与-RMisc不同注意,如果您想说使所有组权限与所有者权限匹配(在IMO中似乎不太可能使所有内容都出错),则完全可以添加当前文件夹位置:
chmod-r 0777。
chmod -R 0777