UNIX-更改文件而不是目录的chmod

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

ls -lR | grep ^-r | chmod 664

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

谢谢

Ori asked 2019-10-02T15:47:34Z
5个解决方案
95 votes

一个-print0答案是一个很好的答案,但它通常具有不相关的缺点,即为每个文件创建一个单独的子过程。 但是,它的功能非常完善,并且仅在文件数量非常大时才会表现不佳。 使用find将文件名分成大组,然后为该组文件运行子进程。

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

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

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

-print0导致find以NUL字符(而不是空格)终止其输出流上的文件名,并且-0xargs告知它应将其作为输入格式。

paxdiablo answered 2019-10-02T15:48:16Z
29 votes

执行此操作的另一种方法是使用-exec,如下所示:

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

问题是-exec为每个文件启动了chmod进程。 xargs方法可以避免这种情况,并且如果您具有可以解决“路径名中的空格”问题的findxargs的版本,则它是高级的。 查看已接受的答案。

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

Stephen C answered 2019-10-02T15:49:02Z
18 votes

我简洁的两分钱...

Linux的:

$ chmod 644 `find -type f`

OSX:

$ chmod 644 `find . -type f`

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

$ chmod 644 `find /home/my/special/folder -type f`
Arman H answered 2019-10-02T15:49:54Z
2 votes

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

“找到。-type f -print | xargs chmod 444”应该工作,不是吗?   如果不是,请查找。 -print> myfile.sh   和vi myfile.sh删除目录(它们不应太多),然后   1,$ s / ^ / chmod 444 /   并关闭myfile.sh。

b0x0rz answered 2019-10-02T15:50:32Z
2 votes

用GNU查找

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

ghostdog74 answered 2019-10-02T15:51:13Z
translate from https://stackoverflow.com:/questions/1163294/changing-chmod-for-files-but-not-directories