xargs错误:文件名太长

时间:2017-02-18 19:22:27

标签: linux bash shell grep

我有一个包含恶意文件名列表的文件。有许多文件名包含空格。我需要找到它们并更改其权限。我尝试过以下方法:

 grep -E  ". " suspicious.txt | xargs -0  chmod 000 

但是我收到了一个错误:

:File name too long 

一个想法?

2 个答案:

答案 0 :(得分:6)

好的,你的文件中每行有一个文件名,问题是没有xargs的{​​{1}}会将空格和制表符以及换行符视为文件分隔符,而{{1} with -0期望文件名由xargs个字符分隔,根本不关心换行符。

在将结果输入-0命令之前,将换行符转换为NUL

NUL

答案 1 :(得分:0)

<强>更新

请参阅Mark Reeds正确答案。这是错误的,因为文件中的文件名需要空值,而不是grep生成的文件名。

<强>原始

你需要更像这样的东西:

grep -Z -E  ". " suspicious.txt | xargs -0  chmod 000 

来自xargs手册页:

  

因为Unix文件名可以包含空格和换行符,所以这种默认行为通常是有问题的;包含空格和/或换行符的文件名由xargs错误处理。在这些情况下,最好使用-0选项,以防止此类问题。使用此选项时,您需要确保为xargs生成输入的程序也使用空字符作为分隔符。

从grep手册页:

-Z, --null
     

输出零字节(ASCII NUL字符),而不是通常在文件名后面的字符。例如,grep -lZ在每个文件名后输出一个零字节,而不是通常的换行符。即使存在包含不常用字符(如换行符)的文件名,此选项也会使输出明确无误。此选项可与find -print0,perl -0,sort -z和xargs -0等命令一起使用,以处理任意文件名,甚至是包含换行符的文件名。