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

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

我正在对迁移到 UNIX 系统的一些文件的权限进行大规模递归更改。我把它们改成了ug+rw,但是后来发现无法遍历子目录。我查看了手册页,chmod没有看到任何关于排除目录的解释,所以我用谷歌搜索了一下,发现人们过去find常常递归地更改目录的权限,以便为用户和组“执行”。我这样做了,然后我就可以调查他们了。

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

答案1

更好的解决方案应该是

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

其中大写的X意思是:设置执行位 if

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

(引自chmod手册页)。

或者,如果您想使用find

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

答案2

使用 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),然后调用该命令并开始重建新命令。最后一条语句为每个文件生成一个新进程,因此效率较低。

相关内容