![递归更改文件权限但不更改目录?](https://linux22.com/image/17672/%E9%80%92%E5%BD%92%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E4%BD%86%E4%B8%8D%E6%9B%B4%E6%94%B9%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
我正在对迁移到 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),然后调用该命令并开始重建新命令。最后一条语句为每个文件生成一个新进程,因此效率较低。