我需要使用chmod将所有文件递归更改为664.我想跳过这些文件夹。 我在考虑做这样的事情
ls -lR | grep ^-r | chmod 664
这不起作用,我假设因为我无法管道进入chmod 有人知道一个简单的方法吗?
由于
答案 0 :(得分:97)
find -exec
答案是一个很好的答案,但它通常无关紧要的缺点是它为每个文件创建一个单独的子进程。然而,它的功能非常完美,只有当文件数量真正大时才会表现不佳。在为该组文件运行子流程之前,使用xargs
会将文件名批处理为大组。
您必须要小心,在使用xargs
时,您可以正确处理包含空格,换行符或其他特殊字符的文件名。
解决这两个问题的解决方案是(假设你有足够好的find
和xargs
实现):
find . -type f -print0 | xargs -0 chmod 644
-print0
导致find
使用NUL字符(而不是空格)终止其输出流上的文件名,-0
到xargs
让它知道它应该期望作为输入格式。
答案 1 :(得分:29)
另一种方法是使用find ... -exec ...
,如下所示:
find . -type f -exec chmod 644 {} \;
问题是-exec
为每个文件启动chmod
进程。 xargs
方法可以避免这种情况,只要您拥有可以应对“路径名中的空格”问题的find
和xargs
版本,这种方法就更好了。看到接受的答案。
对于记录,如果有太多文件需要进行编码,或者路径名的聚合长度太大,则使用反向标记将会中断。
答案 2 :(得分:18)
我的简洁两分钱......
Linux中:
$ chmod 644 `find -type f`
OSX:
$ chmod 644 `find . -type f`
这可以递归地更改当前目录及其所有子目录中包含的所有文件。如果要定位其他目录,请使用正确的路径替换.
:
$ chmod 644 `find /home/my/special/folder -type f`
答案 3 :(得分:2)
“找。-type f -print | xargs chmod 444”shoud work,不是吗? 如果没有,找到。 -print> myfile.sh 和vi myfile.sh删除目录(它们不应该太多),然后 1,$ s / ^ / chmod 444 / 和sh myfile.sh。
答案 4 :(得分:2)
使用GNU find
find /path -type f -exec chmod 644 {} +;