Bash 如何对文件夹中包含字符串的所有文件进行cat

Bash 如何对文件夹中包含字符串的所有文件进行cat,bash,Bash,我是bash的新手,希望能得到一些建议 我想在bash中运行一个命令,以cat在充满文本文件的文件夹中包含特定字符串的所有文件。在这些文本文件中有唯一的代码,因此可以方便地对文件夹运行此查询,以查看其中包含代码abc123的所有文件 所以有点像:cat“abc123”| more 如果我能在没有猫的情况下做到这一点,我也很乐意这么做 不确定是否可能,如有任何帮助,将不胜感激:) 谢谢 您可以使用: grep -l "abc123" * 2>/dev/null | xargs -d '\n'

我是bash的新手,希望能得到一些建议

我想在bash中运行一个命令,以
cat
在充满文本文件的文件夹中包含特定字符串的所有文件。在这些文本文件中有唯一的代码,因此可以方便地对文件夹运行此查询,以查看其中包含代码
abc123
的所有文件

所以有点像:
cat“abc123”| more

如果我能在没有猫的情况下做到这一点,我也很乐意这么做

不确定是否可能,如有任何帮助,将不胜感激:)

谢谢

您可以使用:

grep -l "abc123" * 2>/dev/null | xargs -d '\n' cat
  • grep-l*
    :-l选项返回包含文本SOMETHING的所有文件的文件名
    *
    检查当前目录中的所有文件
  • 2>/dev/null
    用于禁止
    grep
    上的标准输出。如果没有它,最经典的消息是“grep:DIRNAME:is a directory”
  • 通过管道将其传输到
    xargs
    ,该管道从grep输出中获取文件名,并将命令
    cat
    应用于每个文件名
更新:将
-d'\n'
添加到
xargs
命令中,以正确处理名称中带有空格的文件。

您可以使用以下方法:

grep -l "abc123" * 2>/dev/null | xargs -d '\n' cat
  • grep-l*
    :-l选项返回包含文本SOMETHING的所有文件的文件名
    *
    检查当前目录中的所有文件
  • 2>/dev/null
    用于禁止
    grep
    上的标准输出。如果没有它,最经典的消息是“grep:DIRNAME:is a directory”
  • 通过管道将其传输到
    xargs
    ,该管道从grep输出中获取文件名,并将命令
    cat
    应用于每个文件名

更新:将
-d'\n'
添加到
xargs
命令中,以正确处理名称中带有空格的文件。

我将使用
查找
,如下所示:

find FOLDER -type f -exec grep -q 'abc123' {} \; -exec cat {} \;

我会使用
find
,如下所示:

find FOLDER -type f -exec grep -q 'abc123' {} \; -exec cat {} \;

正如我在下面的评论中提到的,安全的方法是使用:

grep -lZs "abc123" * | xargs -0 cat
-Z
告诉grep使用空字节而不是换行符作为分隔符进行输出。由于路径中不允许使用空字节,因此这是在命令之间传递文件列表的唯一安全方法
-s
抑制“关于不存在或不可读文件的错误消息”,无需重定向stderr(尽管我认为原则上,grep可能会生成其他类型的错误消息,您希望重定向)

-0
告诉xargs参数列表由空字节分隔,因此由
grep-Z
生成的输出可以作为参数列表传递给cat


使用
find
也可以工作,但是中的命令对找到的每个文件分别调用
grep
cat
,而此答案中的代码调用一个
grep
,并根据需要调用尽可能少的
cat
,考虑到单个命令行的最大长度。

正如我在下面的评论中提到的,安全的方法是使用:

grep -lZs "abc123" * | xargs -0 cat
-Z
告诉grep使用空字节而不是换行符作为分隔符进行输出。由于路径中不允许使用空字节,因此这是在命令之间传递文件列表的唯一安全方法
-s
抑制“关于不存在或不可读文件的错误消息”,无需重定向stderr(尽管我认为原则上,grep可能会生成其他类型的错误消息,您希望重定向)

-0
告诉xargs参数列表由空字节分隔,因此由
grep-Z
生成的输出可以作为参数列表传递给cat


使用
find
也可以工作,但是中的命令对找到的每个文件分别调用
grep
cat
,而此答案中的代码调用一个
grep
,并根据需要调用尽可能少的
cat
,考虑到单个命令行的最大长度。

cat$(grep-l“abc123”*)
@PS。一旦任何文件的名称包含空格或全局字符,该建议就会中断……而这一建议在如果文件名包含换行符-您可以使用
grep-lZ
xargs-0
来解决此问题。@TomFenech当文件名中有空格时,此换行符已断开-这不是真正看到的rarely@hek2mgl哦,没错。我想,
xargs-d'\n'
将是一个折中的解决方案,不过如果可能的话,最好使用我之前建议的选项。或者
cat$(grep-l“abc123”*)
@PS。一旦任何文件的名称包含空格或全局字符,这个建议就会中断(公认罕见)如果文件名包含换行符-您可以使用
grep-lZ
xargs-0
来解决此问题。@TomFenech当文件名中有空格时,此换行符已断开-这不是真正看到的rarely@hek2mgl哦,没错。我想
xargs-d'\n'
将是一个半途而废的解决方案,尽管如果可能的话最好使用我之前建议的选项。这比Nic3500的答案更安全,因为它允许文件名中所有可能的字符(包括换行符)。这比Nic3500的答案更安全,因为它允许文件名中所有可能的字符(包括换行符)。