改变文件而不是目录的chmod

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

ls -lR | grep ^-r | chmod 664 

这不工作,我假设,因为我不能pipe入chmod任何人都知道一个简单的方法来做到这一点?

谢谢

find -exec答案是一个很好的答案,但是它为每一个单独的文件创build一个单独的subprocess,通常是不相干的缺点。 然而,它是完美的function,只有当文件数量真的很大,才会performance不好。 在运行该文件的subprocess之前,使用xargs会将文件名批量化为较大的组。

你只需要小心一点,在使用xargs ,你可以正确处理带有embedded空格,换行符或其他特殊字符的文件名。

解决这两个问题的解决scheme是(假设你有一个体面的findxargs实现):

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

-print0会导致find用其NUL字符(而不是空格)终止输出stream上的文件名, -0xargs让它知道它应该将input格式当作input。

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

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

问题是-exec为每个文件启动一个chmod进程。 xargs方法可以避免这种情况,如果你有一个findxargs版本可以处理“空间中的path名”问题, 看到接受的答案。

而且为了logging,如果有太多的文件需要chmoded,或者path名的聚合长度太大,使用back-ticks将会中断。

我简洁的两分钱…

Linux的:

 $ chmod 644 `find -type f` 

OSX:

 $ chmod 644 `find . -type f` 

这将recursion地更改当前目录及其所有子目录中包含的所有文件。 如果您想要定位不同的目录,请replace. 用正确的path:

 $ chmod 644 `find /home/my/special/folder -type f` 

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

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

与GNU发现

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