在 UNIX 中:文件夹中包含.sas扩展名为(程序)的文件和扩展名为.sas7bdat(表)的文件。我需要找到包含文本“liasse”的程序(而不是表格)。我尝试启动这个命令:
grep -rli liasse *.sas ./
Run Code Online (Sandbox Code Playgroud)
在结果中我可以看到表名。仅检索程序的命令应该是什么?
这是一个符合 POSIX 标准的命令,可以grep同时启动多个文件:
find . -type f -name \'*.sas\' -exec grep -li liasse {} +\nRun Code Online (Sandbox Code Playgroud)\n您的命令grep -rli liasse *.sas ./未按您的预期工作。让我们分析一下会发生什么:
*.sas经历 shell 通配符。*.sas,则将所有对象都放置在liasse.grep可能会得到文字*.sas作为要检查的路径(这取决于;调查例如shopt -s nullglob,shopt -s failglob在bash)并抛出警告。grep,都会./在搜索liasse内部文件时递归地获取和处理它。这会处理以下所有文件./:程序、表格等。这就是为什么您可以在结果中获得表名称的原因。
\n我的命令仅针对匹配模式的文件find . -type f -name \'*.sas\' -exec grep -li liasse {} +运行。重要的事情:grep*.sas
-type f仅选择常规文件。这样我就可以防止目录名称匹配*.sas(如果有)被传递到grep(grep无论如何-r都应该拒绝它们,但它会不太优雅)。find获取文字*.sas作为操作数的参数-name;它知道如何解释这样的模式。find \xe2\x80\xa6 -exec \xe2\x80\xa6 {} +语法用多个对象代替{}. 与.grepfind \xe2\x80\xa6 -exec \xe2\x80\xa6 {} \\;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)
| 归档时间: |
|
| 查看次数: |
2657 次 |
| 最近记录: |