我有一个文件列表。列表很大,文件名是非标准的:这意味着,有些包含空格,非ascii字符,引号,单引号......
因此,将巨大的文件列表作为参数传递给grep不是一个选项:
xargs
对参数进行分区来解决这个问题。必须有一个更简单的方法:我如何告诉grep使用我的文件列表作为grep文件?我假设由于shell不会处理文件列表,因此转义和参数长度不再是问题。问题是grep是否支持这种操作模式,我无法在文档中找到它。
答案 0 :(得分:7)
据我所知,GNU grep不支持这个。你有几个选择。
使用bash循环解析文件列表
这是@fedorqui提供的解决方案
while read file; do
grep "$PATTERN" "$file"
done < file_with_list_of_files
使用xargs立即将多个文件传递给grep
在这里,我告诉xargs将10个文件名传递给grep
PATTERN='^$' # searching for blank lines
xargs -n 10 -d '\n' grep "$PATTERN" < file_with_list_of_files
使用xargs一次将多个文件传递给grep,处理文件名中的换行符
如上所述,但使用以空值终止的行
PATTERN='^$' # searching for blank lines
tr '\n' '\0' file_with_list_of_files
xargs -n 10 -0 grep "$PATTERN" < file_with_list_of_files
编辑:正确处理空白 Edit2:删除产生乱码输出的示例,添加处理换行符的示例