使用 find 获取文件后使用 grep

使用 find 获取文件后使用 grep

所以我对命令行比较陌生。我能够使用 find 从多个目录获取多个文件的输出,因为这些文件没有特定的位置(我确信这可以缩短):

find ./ -name filename1.ext && find ./ -name filename2.ext && find ./ -name filename3.ext

现在这给了我我想要的列表,但现在我已经找到了有问题的文件,我想 grep 它们以获取信息。

答案1

您可以将所有name主项分组到一个 find 语句中,然后让 find 执行 grep。

find . \( -name filename1.ext -o \
      -name filename2.ext -o \
      -name filename3.ext \) \
      -exec grep 'pattern' {} \;

答案2

尝试这个,

find ./ -type f \( -name filename1.ext -o -name filename2.ext -o -name filename3.ext \) -exec grep 'string' {} \;
  • -type f由于您正在查找文件,因此最好指定类型以更快地获得结果。

  • -o表示“或”,它使您能够在搜索中添加更多文件名

答案3

除了正确的答案确实是使用-oand 之外-exec,这是捕获上一个命令的输出并逐行解析它的通用方法

(find .... && find ... && cat ... && ls ... && ...) | while read line; do grep string $line; done

答案4

一般来说,至少有三种方法可以进行find+grep组合:

  1. grep 图案 `find 目录 查找说明符 -print`
  2. find 目录 查找说明符 -exec grep 图案 {} \;
  3. find 目录 查找说明符 -print | xargs grep 图案

当然,grep这里没有什么特别的;这三个相同的模式可用于find任何命令。

从某种意义上说,第 1 种方法是最古老和最基本的方法,因为反引号一直是捕获一个命令的输出并在另一个命令的命令行上使用它的方法。 (这些天,我得到的印象是,有一种比反引号更好的新的 bashism,并且所有酷孩子都使用它,但我想我是一个老前辈。)数字 1 的缺点是,如果find找到很多文件,您可能会收到错误“命令行太长”。

数字 2 是内置的一个特殊功能,find用于执行find+ 命令组合。就目前而言,它很好,但它有两个缺点:(1)它grep为找到的每个文件重新调用辅助命令(或其他命令),因此它可能很慢,并且(2)如果辅助命令是grep,因为每次调用都会grep看到一个文件名,它不会列出匹配中的文件名,尽管您可以通过执行以下操作来解决此问题-exec grep 图案 {} /dev/null \;或者,这些天,-exec grep -H 图案 {} \;

然后是第三个。据我所知,它的xargs发明是为了克服前两个的局限性。尽管xargs理论上它是一个通用程序,但我怀疑在实践中它几乎从未与除 和 之外的任何一对程序一起find使用grep。它彻底解决了#1 的缺点;它将适用于任意数量的找到的文件。它很有效,但如果你不走运,它偶尔会调用grep最后一个文件名,这意味着你仍然想使用/dev/nullor-H技巧。它有自己的缺点:如果找到的任何文件名包含空格,它就不起作用。但也有一种解决方法:

find 目录 查找说明符 -print0 | xargs -0 grep 图案

(我非常希望xargs被写入默认情况下接受换行符分隔的文件名而不是空格,但这是另一天的咆哮。)

相关内容