75

我需要使用 chmod 将所有文件递归更改为 664。我想跳过文件夹。我正在考虑做这样的事情

ls -lR | grep ^-r | chmod 664

这不起作用,我假设因为我无法通过管道进入 chmod 任何人都知道一个简单的方法来做到这一点?

谢谢

4

5 回答 5

117

答案是一个很好的find -exec答案,但它具有通常不相关的缺点,即它为每个文件创建一个单独的子进程。然而,它的功能非常完美,只有当文件数量变得非常大时才会表现不佳。在为该组文件运行子进程之前,使用xargs会将文件名分批成大组。

您只需要注意,在使用xargs时,您可以正确处理带有嵌入空格、换行符或其他特殊字符的文件名。

解决这两个问题的解决方案是(假设您有足够体面的find实现xargs):

find . -type f -print0 | xargs -0 chmod 644

使用 NUL 字符(而不是空格)在其输出流上终止文件名的-print0原因以及to让它知道它应该期望它作为输入格式。find-0xargs

于 2009-07-22T06:18:23.240 回答
33

另一种方法是使用find ... -exec ...如下:

find . -type f -exec chmod 644 {} \;

问题是为每个文件-exec启动一个效率低下的进程。chmod避免这种情况的解决方案是:

find . -type f -exec chmod 644 {} +

chmod这会在进程命令行上组装尽可能多的文件名参数。find ... | xargs ...方法类似;查看接受的答案。

作为记录,如果要 chmoded 的文件太多,或者路径名的聚合长度太大,则使用反引号将会中断。

于 2009-07-22T06:03:20.790 回答
19

我简洁的两分钱...

Linux:

$ chmod 644 `find -type f`

操作系统:

$ chmod 644 `find . -type f`

这可以递归地更改当前目录及其所有子目录中包含的所有文件。如果要针对不同的目录,请替换.为正确的路径:

$ chmod 644 `find /home/my/special/folder -type f`
于 2014-03-24T06:12:26.633 回答
2

通过http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed

“find . -type f -print | xargs chmod 444 “应该工作,不是吗?如果没有,请查找 . -print >myfile.sh 和 vi myfile.sh 删除目录(它们不应该太多),然后是 1,$s/^/chmod 444/ 和 sh myfile.sh。

于 2009-07-22T06:01:12.323 回答
2

使用 GNU 查找

find /path -type f -exec chmod 644 {} +;

于 2009-07-22T06:49:25.627 回答