Linux xargs错误:文件名太长
我有一个包含恶意文件名列表的文件。有许多文件名包含空格。我需要找到他们并更改他们的权限。我尝试了以下方法:Linux xargs错误:文件名太长,linux,bash,shell,grep,Linux,Bash,Shell,Grep,我有一个包含恶意文件名列表的文件。有许多文件名包含空格。我需要找到他们并更改他们的权限。我尝试了以下方法: grep -E ". " suspicious.txt | xargs -0 chmod 000 但我得到了一个错误: :File name too long 想法?更新: 请看正确答案。这是错误的,因为文件中的文件名需要空值,而不是由grep生成的文件名 原件: 你需要更像这样的东西: grep -Z -E ". " suspicious.txt | xargs -0
grep -E ". " suspicious.txt | xargs -0 chmod 000
但我得到了一个错误:
:File name too long
想法?更新: 请看正确答案。这是错误的,因为文件中的文件名需要空值,而不是由
grep
生成的文件名
原件:
你需要更像这样的东西:
grep -Z -E ". " suspicious.txt | xargs -0 chmod 000
从xargs手册页:
因为Unix文件名可以包含空格和换行符,所以这种默认行为通常是有问题的;xargs错误地处理了包含空格和/或换行符的文件名。在这些情况下,最好使用-0选项,这样可以防止此类问题。使用此选项时,需要确保为xargs生成输入的程序也使用空字符作为分隔符
从grep手册页:
输出一个零字节(ASCII NUL字符),而不是通常跟在文件名后面的字符。例如,grep-lZ在每个文件名后输出一个零字节,而不是通常的换行符。此选项使输出明确无误,即使文件名包含不寻常的字符,如换行符。此选项可以与find-print0、perl-0、sort-z和xargs-0等命令一起使用,以处理任意文件名,甚至是包含换行符的文件名
好的,文件中每行有一个文件名,问题是不带
-0
的xargs
将空格和制表符以及换行符视为文件分隔符,而带有-0
的xargs
希望文件名用NUL
字符分隔,并且根本不关心换行符
因此,在将结果输入到xargs-0
命令之前,将换行符转换为NUL
s:
grep -E ". " suspicious.txt | tr '\n' '\0' | xargs -0 chmod 000
不,那不对。文件名是文本文件中的行;它们已经用新行分隔了
-Z
仅对grep
本身(例如通过grep-l
)输出的文件名有帮助。
grep -E ". " suspicious.txt | tr '\n' '\0' | xargs -0 chmod 000