找 。.[^.]* -type f -print0 | xargs -0 须藤 chmod 664;不起作用

cli*_*ime 3 find chmod xargs

我正在使用此命令递归地设置文件的权限

clime@vm6879 /srv/www-php/steeltrading $ find . .[^.]* -type f -print0 | xargs -0 sudo chmod 664
Run Code Online (Sandbox Code Playgroud)

但是在执行该命令后,某些文件(大部分)的权限仍然没有改变。

clime@vm6879 /srv/www-php/steeltrading $ ll media/xmlconnect/system/ok.gif 
-rwxrwxr-x. 1 www www 295 Jul  5  2012 media/xmlconnect/system/ok.gif
Run Code Online (Sandbox Code Playgroud)

如果我运行只是find为了查看文件是否在列表中,我可以看到它:

clime@vm6879 /srv/www-php/steeltrading $ find . .[^.]* -type f | grep ok.gif
./media/xmlconnect/custom/ok.gif
./media/xmlconnect/original/ok.gif
./media/xmlconnect/system/ok.gif
Run Code Online (Sandbox Code Playgroud)

如果我进入目录媒体并再次运行该命令,该文件最终会获得正确的权限。

clime@vm6879 /srv/www-php/steeltrading $ cd media/
clime@vm6879 /srv/www-php/steeltrading/media $ find . .[^.]* -type f -print0 | xargs -0 sudo chmod 664
clime@vm6879 /srv/www-php/steeltrading/media $ ll xmlconnect/system/ok.gif 
-rw-rw-r--. 1 www www 295 Jul  5  2012 xmlconnect/system/ok.gif
Run Code Online (Sandbox Code Playgroud)

似乎sudo chmod 664没有对某些文件执行,这似乎xargs是问题所在,但很奇怪(没有错误消息)。知道可能是什么原因吗?

编辑:或者也许管道大量数据可能是一个问题?

Sté*_*las 6

find不会跳过点文件,因此.[^.]*.[!.]*在标准语法中)是多余的,并且会导致这些文件被处理两次(并且目录被降序两次)。(另请注意,例如.[!.]*缺少文件调用..foo)。

但是,find默认情况下,不会下降到目录的符号链接。因此,如果media是指向外部区域的符号链接.,则不会处理其中的文件。

您可以使用-L来告诉 find 遵循符号链接。但是请注意,它也会导致chmod调用作为常规文件符号链接的文件。

sudo find -L . -type f -exec chmod 664 {} +
Run Code Online (Sandbox Code Playgroud)

或者使用一些find/xargs实现:

find -L . -type f -print0 | sudo xargs -r0 chmod 664
Run Code Online (Sandbox Code Playgroud)

相反的是已经在这里说,xargsfind -exec +会照顾分裂的参数列表chmod,如果它太大了。

但是应该注意的是,我们在这里讨论的限制是传递给命令(execve(2)系统调用)的参数和环境的累积大小。

find并将xargs确保未达到该限制(并留出一点余量),但如果您将其运行为:

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

代替:

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

sudo命令(由 调用xargs)将接收要传递给的所有参数,chmod并且还会将一个SUDO_COMMAND环境变量传递给chmod另一个包含文件列表的环境变量,因此它将是传递给的 arg+env 大小的两倍,chmod并解释为什么限制超过了。