我需要使用chmod将所有文件递归更改为664.我想跳过这些文件夹.我在考虑做这样的事情
ls -lR | grep ^-r | chmod 664
Run Code Online (Sandbox Code Playgroud)
这不起作用,我假设因为我无法管道进入chmod任何人都知道一个简单的方法来做到这一点?
谢谢
pax*_*blo 101
find -exec答案是一个很好的答案,但它通常无关紧要的缺点是它为每个文件创建一个单独的子进程.然而,它功能完善,只有当文件数量变得非常大时才会表现不佳.xargs在为该组文件运行子进程之前,使用将批处理文件名为大组.
您必须要小心,在使用中xargs,您可以正确处理带有嵌入空格,换行符或其他特殊字符的文件名.
解决这两个问题的解决方案是(假设你有足够的体面find和xargs实现):
find . -type f -print0 | xargs -0 chmod 644
Run Code Online (Sandbox Code Playgroud)
该-print0原因find终止与NUL字符(而不是空间)的输出流的文件名和-0要xargs让它知道它应该想到,作为输入格式.
Ste*_*n C 29
另一种方法是使用find ... -exec ...如下:
find . -type f -exec chmod 644 {} \;
Run Code Online (Sandbox Code Playgroud)
问题是为每个文件-exec启动一个chmod进程.该xargs方法避免了这一点,并优于前提是你有一个版本find,并xargs可以与问题"的路径名空间"应付; 看到接受的答案.
而对于记录,如果有太多要编码的文件,或者路径名的聚合长度太大,则使用反向标记将会中断.
Arm*_*n H 19
我的简洁两分钱......
Linux的:
$ chmod 644 `find -type f`
Run Code Online (Sandbox Code Playgroud)
OSX:
$ chmod 644 `find . -type f`
Run Code Online (Sandbox Code Playgroud)
这可以递归地更改当前目录及其所有子目录中包含的所有文件.如果要定位其他目录,请.使用正确的路径替换:
$ chmod 644 `find /home/my/special/folder -type f`
Run Code Online (Sandbox Code Playgroud)