将文件列表传递给grep

dan*_*ast 7 grep

我有一个文件列表.列表很大,文件名是非标准的:这意味着,有些包含空格,非ascii字符,引号,单引号......

因此,将这个巨大的文件列表作为参数传递给grep不是一个选项:

  • 因为我不确定我是否会超过linux中允许的参数长度.我想我可以通过分区参数来解决这个问题xargs.
  • 因为逃避这些角色很复杂.如果我想用双引号括起文件名,并且该文件名碰巧有双引号,我就麻烦了.所以我需要逃避一些角色.整件事看起来很复杂,我不想走这条路.

必须有一个更简单的方法:我如何告诉grep使用我的文件列表作为grep文件?我假设由于shell不会处理文件列表,因此转义和参数长度不再是问题.问题是grep是否支持这种操作模式,我在文档中找不到.

dwu*_*urf 7

据我所知,GNU grep不支持这个.你有几个选择.

使用bash循环来解析文件列表

这是@fedorqui提供的解决方案

while read file; do 
    grep "$PATTERN" "$file" 
done < file_with_list_of_files
Run Code Online (Sandbox Code Playgroud)

使用xargs一次将多个文件传递给grep

在这里,我告诉xargs将10个文件名传递给grep

PATTERN='^$' # searching for blank lines
xargs -n 10 -d '\n' grep "$PATTERN" < file_with_list_of_files
Run Code Online (Sandbox Code Playgroud)

使用xargs一次将多个文件传递给grep,处理文件名中的换行符

如上所述,但使用以null结尾的行

PATTERN='^$' # searching for blank lines
tr '\n' '\0' file_with_list_of_files
xargs -n 10 -0 grep "$PATTERN" < file_with_list_of_files
Run Code Online (Sandbox Code Playgroud)

编辑:正确处理空白区域 Edit2:删除产生乱码输出的示例,添加处理换行符的示例