为文件而不是目录更改 chmod

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

ls -lR | grep ^-r | chmod 664

我猜这没用,因为我无法接入 chmod 有人知道一个简单的方法吗?

谢谢

66932 次浏览

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

“ find.-type f-print | xargs chmod 444”应该可以吧? 如果没有,查找。-print > myfile.sh 和 vi myfile.sh 删除目录(它们不应该太多) ,然后 1,$s/^/chmod 444/ 还有我的档案。

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

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

问题是 -exec为每个效率低下的文件启动一个 chmod进程。避免这种情况的解决办法是:

find . -type f -exec chmod 644 {} +

这样可以在 chmod进程命令行上组装尽可能多的文件名参数。find ... | xargs ...方法类似; 请参阅已接受的答案。

对于记录,如果有太多的文件需要 chmoded,或者路径名的聚合长度太大,使用反勾号将会中断。

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

您只需要注意,在使用 xargs时,您需要正确处理包含嵌入空格、换行或其他特殊字符的文件名。

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

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

-print0使得 find以 NUL 字符(而不是空格)终止其输出流上的文件名,而 -0xargs让它知道它应该以这种格式作为输入格式。

GNU 的搜索结果

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

我简洁的两点建议是..。

Linux:

$ chmod 644 `find -type f`

OSX:

$ chmod 644 `find . -type f`

这样可以递归地更改工作目录及其所有子目录中包含的所有文件。如果您希望以不同的目录为目标,请用正确的路径替换 .:

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