7

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

因此,将庞大的文件列表作为参数传递给 grep 不是一种选择:

  • 因为我不确定我不会超过 linux 中允许的参数长度。不过,我想我可以通过用 划分参数来解决这个问题xargs
  • 因为转义这些字符很复杂。如果我想用双引号将文件名括起来,而该文件名恰好有双引号,我就有麻烦了。所以我需要转义一些字符。整个事情看起来很复杂,我不想走那条路。

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

4

1 回答 1

8

据我所知,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:删除产生乱码输出的示例,添加处理换行符的示例

于 2013-11-06T00:32:34.190 回答