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

时间:2018-07-23 11:42:58

标签: bash

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

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

所以有点像cat "abc123" | more吗?

如果没有cat就可以实现这一目标-也很乐意这样做。

不确定是否有可能,将不胜感激:)

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用此:

grep -l "abc123" * 2>/dev/null | xargs -d '\n' cat
  • grep -l <SOMETHING> *:-l选项返回包含文本SOMETHING的所有文件的文件名。 *检查当前目录中的所有文件。
  • 2>/dev/null用于禁止grep上的stdout。没有它,您收到的最经典的消息是“ grep:DIRNAME:是目录”。
  • 将其插入xargs,后者将从grep输出中获取文件名,并将命令cat应用于每一个。

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

答案 1 :(得分:1)

我会这样使用find

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

答案 2 :(得分:1)

正如我在Nic2500's answer下面的评论中所提到的,执行此操作的安全方法是使用:

grep -lZs "abc123" * | xargs -0 cat

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

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

也可以使用find,但是hek2mgl's answer中的命令针对找到的每个文件分别调用grepcat,而此答案中的代码考虑到单个命令行的最大长度,会调用一个grep和所需的cat数。