更改文件的chmod而不是目录

时间:2009-07-22 05:58:55

标签: unix grep chmod

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

ls -lR | grep ^-r | chmod 664

这不起作用,我假设因为我无法管道进入chmod 有人知道一个简单的方法吗?

由于

5 个答案:

答案 0 :(得分:97)

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

您必须要小心,在使用xargs时,您可以正确处理包含空格,换行符或其他特殊字符的文件名。

解决这两个问题的解决方案是(假设你有足够好的findxargs实现):

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

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

答案 1 :(得分:29)

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

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

问题是-exec为每个文件启动chmod进程。 xargs方法可以避免这种情况,只要您拥有可以应对“路径名中的空格”问题的findxargs版本,这种方法就更好了。看到接受的答案。

对于记录,如果有太多文件需要进行编码,或者路径名的聚合长度太大,则使用反向标记将会中断。

答案 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)

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

  

“找。-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 {} +;