我有一个包含恶意文件名列表的文件。有许多文件名包含空格。我需要找到它们并更改其权限。我尝试过以下方法:
grep -E ". " suspicious.txt | xargs -0 chmod 000
但是我收到了一个错误:
:File name too long
一个想法?
答案 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等命令一起使用,以处理任意文件名,甚至是包含换行符的文件名。