更改文件的chmod而不是目录

Ori*_*Ori 67 unix grep chmod

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

ls -lR | grep ^-r | chmod 664
Run Code Online (Sandbox Code Playgroud)

这不起作用,我假设因为我无法管道进入chmod任何人都知道一个简单的方法来做到这一点?

谢谢

pax*_*blo 101

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

您必须要小心,在使用中xargs,您可以正确处理带有嵌入空格,换行符或其他特殊字符的文件名.

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

find . -type f -print0 | xargs -0 chmod 644
Run Code Online (Sandbox Code Playgroud)

-print0原因find终止与NUL字符(而不是空间)的输出流的文件名和-0xargs让它知道它应该想到,作为输入格式.

  • 我可以确认此方法在Mac OSX(至少10.9)上可以使用。 (2认同)

Ste*_*n C 29

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

find . -type f -exec chmod 644 {} \;
Run Code Online (Sandbox Code Playgroud)

问题是为每个文件-exec启动一个chmod进程.该xargs方法避免了这一点,并优于前提是你有一个版本find,并xargs可以与问题"的路径名空间"应付; 看到接受的答案.

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

  • 实际上......它是`;`和`+;`之间的区别.反斜杠是shell转义. (2认同)

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)

  • 对于带有空格的名称(Mac OS + Bash),我失败了. (3认同)
  • 谢谢您最简单,最短的解决方案 (2认同)