改变文件而不是目录的chmod
我需要使用chmod将所有文件recursion更改为664.我想跳过这些文件夹。 我正在考虑这样做
ls -lR | grep ^-r | chmod 664
这不工作,我假设,因为我不能pipe入chmod任何人都知道一个简单的方法来做到这一点?
谢谢
find -exec
答案是一个很好的答案,但是它为每一个单独的文件创build一个单独的subprocess,通常是不相干的缺点。 然而,它是完美的function,只有当文件数量真的很大,才会performance不好。 在运行该组文件的subprocess之前,使用xargs
会将文件名批量化为较大的组。
你只需要小心一点,在使用xargs
,你可以正确处理带有embedded空格,换行符或其他特殊字符的文件名。
解决这两个问题的解决scheme是(假设你有一个体面的find
和xargs
实现):
find . -type f -print0 | xargs -0 chmod 644
-print0
会导致find
用其NUL字符(而不是空格)终止输出stream上的文件名, -0
到xargs
让它知道它应该将input格式当作input。
另一种方法是使用find ... -exec ...
如下所示:
find . -type f -exec chmod 644 {} \;
问题是-exec
为每个文件启动一个chmod
进程。 xargs
方法可以避免这种情况,如果你有一个find
和xargs
版本可以处理“空间中的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`
“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 {} +;