将文件列表传递给grep

将文件列表传递给grep,grep,Grep,我在一个文件中有一个文件列表。这个列表非常庞大,文件名也是非标准的:这意味着,有些文件名包含空格、非ascii字符、引号、单引号 因此,将庞大的文件列表作为参数传递给grep不是一个选项: 因为我不确定我不会超过linux中允许的参数长度。不过,我想我可以通过使用xargs对参数进行分区来解决这个问题 因为转义这些字符很复杂。如果我想用双引号括起文件名,而该文件名恰好有双引号,我就麻烦了。所以我需要避开一些角色。整个事情看起来很复杂,我不想走这条路 必须有一个更简单的方法:如何告诉grep使

我在一个文件中有一个文件列表。这个列表非常庞大,文件名也是非标准的:这意味着,有些文件名包含空格、非ascii字符、引号、单引号

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

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

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

使用bash循环解析文件列表

这是@fedorqui提供的解决方案

while read file; do 
    grep "$PATTERN" "$file" 
done < file_with_list_of_files
读取文件时
;做
grep“$PATTERN”“$file”
完成<文件\u与\u文件列表\u
使用xargs一次将多个文件传递给grep

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

PATTERN='^$' # searching for blank lines
xargs -n 10 -d '\n' grep "$PATTERN" < file_with_list_of_files
PATTERN='^$'#搜索空行
xargs-n10-d'\n'grep“$PATTERN”
使用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
PATTERN='^$'#搜索空行
tr'\n'\0'文件\u和\u文件列表\u
xargs-n 10-0 grep“$PATTERN”
编辑:正确处理空白
Edit2:删除产生乱码输出的示例,添加处理换行符的示例

这样的东西对您不管用吗<代码>读取文件时;做格雷普。。。。“$file”完成注意
“$file”
允许文件名中有空格。不确定如果文件有双引号会发生什么。。。我知道这很奇怪,但这是可能的(文件系统支持),谢谢!第一个选项可能太慢(每个文件都有一个新的grep进程)。第三个可以产生乱码输出(几个进程与标准输出并行写入?)。第二个可能是我将使用的。有一个问题:xargs是否能正确处理任何文件名,包括带有unicode字符的文件名,或者像双引号这样的意外字符?xargs需要什么格式?我假设每行一个文件。如何使用嵌入的换行符指定文件名?(奇怪,但文件系统允许这样做)我现在看到
-d
指定了分隔符。我已经用带有非常奇怪字符的文件名测试了您的方法,它工作得非常好(即使是双引号、单引号、空格、任何unicode字符……)。我唯一无法支持的是嵌入的换行符,因为我不知道在这种情况下如何生成文件列表(因为换行符按原样放在lof中,然后xargs假设两个不同的文件)。该角大小写将不受支持。xargs支持使用-0标志以null结尾的字符串,如果以null结尾终止文件名列表,则可能会处理嵌入的换行符大小写。请尝试使用
tr'\n'\0'文件列表
获取此格式的输入列表使用带grep的
-H
标志以文件名作为输出的前缀,就像使用-r时一样。