我需要使用 chmod 将所有文件递归更改为 664。我想跳过文件夹。我正在考虑做这样的事情
ls -lR | grep ^-r | chmod 664
这不起作用,我假设因为我无法通过管道进入 chmod 任何人都知道一个简单的方法来做到这一点?
谢谢
答案是一个很好的find -exec
答案,但它具有通常不相关的缺点,即它为每个文件创建一个单独的子进程。然而,它的功能非常完美,只有当文件数量变得非常大时才会表现不佳。在为该组文件运行子进程之前,使用xargs
会将文件名分批成大组。
您只需要注意,在使用xargs
时,您可以正确处理带有嵌入空格、换行符或其他特殊字符的文件名。
解决这两个问题的解决方案是(假设您有足够体面的find
实现xargs
):
find . -type f -print0 | xargs -0 chmod 644
使用 NUL 字符(而不是空格)在其输出流上终止文件名的-print0
原因以及to让它知道它应该期望它作为输入格式。find
-0
xargs
另一种方法是使用find ... -exec ...
如下:
find . -type f -exec chmod 644 {} \;
问题是为每个文件-exec
启动一个效率低下的进程。chmod
避免这种情况的解决方案是:
find . -type f -exec chmod 644 {} +
chmod
这会在进程命令行上组装尽可能多的文件名参数。find ... | xargs ...
方法类似;查看接受的答案。
作为记录,如果要 chmoded 的文件太多,或者路径名的聚合长度太大,则使用反引号将会中断。
我简洁的两分钱...
Linux:
$ chmod 644 `find -type f`
操作系统:
$ chmod 644 `find . -type f`
这可以递归地更改当前目录及其所有子目录中包含的所有文件。如果要针对不同的目录,请替换.
为正确的路径:
$ chmod 644 `find /home/my/special/folder -type f`
“find . -type f -print | xargs chmod 444 “应该工作,不是吗?如果没有,请查找 . -print >myfile.sh 和 vi myfile.sh 删除目录(它们不应该太多),然后是 1,$s/^/chmod 444/ 和 sh myfile.sh。
使用 GNU 查找
find /path -type f -exec chmod 644 {} +;