递归更改文件权限,但不更改目录?


13

我正在对已经迁移到UNIX系统的某些文件进行权限的大规模递归更改。我将它们更改为ug + rw,但是后来我发现无法遍历子目录。我查看了手册页chmod,但没有找到排除目录的任何解释,因此我搜索了一下,发现人们习惯于find递归地更改目录的权限以对用户和组“执行”。我这样做了,然后我可以调查一下。

但是在我看来,我应该能够做到这一点chmod-递归地将文件更改为读/写,但不会使目录不可遍历。我是否以“正确”的方式完成此操作,或者有更简单的方法来执行此操作?

Answers:


12

更好的解决方案应该是

chmod -R ug=rwX,o=rX /path

大写字母的X意思是:如果设置执行位

该文件是目录或已经具有某些用户的执行权限

(引自chmod手册页)。

或者,如果您想使用 find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)

我为USB硬盘驱动器使用了此命令的所有版本:chmod -v -R ugo = rwX / path谢谢!
Dude 2014年

显然,没有其他方法无法find将所有文件权限设置为600,将所有目录权限设置为700。(我是通过对主题的谷歌搜索到达的。)如果可以使用单个chmod -R命令来完成,请随时进行纠正。
通配符

@Wildcard:不完全是,该命令chmod -R u=rwX,go= /path几乎可以满足您的要求:它将所有目录设置为700,将所有文件设置为600或700,这取决于执行位是否已设置,我认为这是正确的选择。
enzotib

1
@enzotib,是的,几乎可以,但是不完全是。就我而言,我想禁用所有文件(当然不是目录)的执行位,而不管它们是脚本,二进制文件还是其他文件。因此,find您编写的命令作为模板非常有用。:)
通配符

@Wildcard首先递归删除执行位,然后使用上述命令仅将其重新添加到目录中,该怎么办?
迈克尔

3

使用find是“正确”的方法,也是唯一的编程方法,尽管存在一些变化:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

要么

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

或最慢的:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

这些选项中的每一个都会选择一个文件(不是目录,不是符号链接)并chmod在其上应用命令。前两个chmod通过每次将文件附加到内部命令行的末尾直到达到最大值(通常为10个)来减少对调用的次数,然后调用该命令并开始重新构建新命令。最后一条语句为每个文件生成一个新进程,因此效率较低。

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.