如何查找内部包含特定文本和特定扩展名的文件?

Nas*_*ser 6 unix grep find

在 UNIX 中:文件夹中包含.sas扩展名为(程序)的文件和扩展名为.sas7bdat(表)的文件。我需要找到包含文本“liasse”的程序(而不是表格)。我尝试启动这个命令:

grep -rli liasse *.sas ./
Run Code Online (Sandbox Code Playgroud)

在结果中我可以看到表名。仅检索程序的命令应该是什么?

Kam*_*ski 5

这是一个符合 POSIX 标准的命令,可以grep同时启动多个文件:

\n
find . -type f -name \'*.sas\' -exec grep -li liasse {} +\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
\n

您的命令grep -rli liasse *.sas ./未按您的预期工作。让我们分析一下会发生什么:

\n
    \n
  1. *.sas经历 shell 通配符。
  2. \n
  3. 如果当前目录中至少有一个对象匹配*.sas,则将所有对象都放置在liasse.
  4. \n
  5. 如果没有这样的对象,grep可能会得到文字*.sas作为要检查的路径(这取决于;调查例如shopt -s nullglobshopt -s failglobbash)并抛出警告。
  6. \n
  7. 无论哪种方式grep,都会./在搜索liasse内部文件时递归地获取和处理它。这会处理以下所有文件./:程序、表格等。
  8. \n
\n

这就是为什么您可以在结果中获得表名称的原因。

\n
\n

我的命令仅针对匹配模式的文件find . -type f -name \'*.sas\' -exec grep -li liasse {} +运行。重要的事情:grep*.sas

\n
    \n
  • -type f仅选择常规文件。这样我就可以防止目录名称匹配*.sas(如果有)被传递到grepgrep无论如何-r都应该拒绝它们,但它会不太优雅)。
  • \n
  • 引用该模式可以防止 shell 出现通配符;find获取文字*.sas作为操作数的参数-name;它知道如何解释这样的模式。
  • \n
  • find \xe2\x80\xa6 -exec \xe2\x80\xa6 {} +语法用多个对象代替{}. 与.grepfind \xe2\x80\xa6 -exec \xe2\x80\xa6 {} \\;
  • \n
\n


mvw*_*mvw -1

这可以通过以下方式实现

find . -type f -name "*.sas" -print0 | "xargs" -0 -e grep -liH -e liasse
Run Code Online (Sandbox Code Playgroud)

如果您没有选项xargs的实现,这是关于在和-0之间通信一组路径,您可以尝试findxargs

 find . -type f -name "*.sas" -print | "xargs" -e grep -liH -e liasse
Run Code Online (Sandbox Code Playgroud)