为文件而不是目录更改chmod


72

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

ls -lR | grep ^-r | chmod 664

我认为这是行不通的,因为我无法通过管道插入chmod有人知道这样做的简单方法吗?

谢谢


1
这应该在ServerFault
MoshiBin

chmod实际上应该能够自己区分文件,链接和文件夹。
Xeoncross

Answers:


113

一个find -exec答案是一个很好的答案,但它通常具有不相关的缺点,即为每个文件创建一个单独的子过程。然而,它的完美的功能,只会表现不佳时,文件的数量变得大。使用xargs意愿批了文件名到大集团运行的子过程,以前文件。

您只需要注意使用 xargs,您必须正确处理带有嵌入式空格,换行符或其他特殊字符的文件名。

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

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

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


这对GNU查找很有用,但是不幸的是-print0和xargs -0不是标准的,例如在Solaris上不起作用。因此,在这种情况下,请使用其他解决方案之一。
mark4o

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

@ mark4o,您不仅限于使用Solaris随附的braindead版本。FOSS的一大优点是您可以将其移植到任何足够接近的(UNIXy)操作系统。对于AIX per-version-5L,我经常这样做。
paxdiablo 2014年

1
如果你的意思是有太多很多的争论chmod,这不是一个问题。xargs明智地分批处理。
paxdiablo

1
@codeforester,xargs 已经对文件进行批处理,因此它们不会超过参数长度限制。这些-n/-L选项仅允许对批处理大小进行进一步的任意限制。
paxdiablo

31

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

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

问题在于,-exec启动chmod每个文件的过程。该xargs方法可以避免这种情况,并且如果您具有findxargs可以解决“路径名中的空格”问题。查看已接受的答案。

记录下来,如果有太多文件无法更改,或者路径名的总长度太大,则使用反引号将中断。


1
\和之间有什么区别+
陈先生如何

2
其实...这之间的差别;+;。反斜杠是外壳转义符。
斯蒂芬C

18

我简洁的两分钱...

Linux:

$ chmod 644 `find -type f`

OSX:

$ chmod 644 `find . -type f`

这可以递归方式更改当前目录及其所有子目录中包含的所有文件。如果要定位到其他目录,请.使用正确的路径替换:

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

您如何指定哪个目录?
TQ

1
我最初的回答涵盖了OP的要求:递归地更改当前目录中的所有文件。请参阅我的编辑,以了解如何将其应用于任何目录,而不仅仅是当前目录。
Arman H

2
感谢您提供最简单,最短的解决方案
asherrard

3
对我来说,使用空格的名称(Mac OS + Bash)失败。
Mat Gessel


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.