在 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 {} +\n
Run 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 {} +
语法用多个对象代替{}
. 与.grep
find \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
之间通信一组路径,您可以尝试find
xargs
find . -type f -name "*.sas" -print | "xargs" -e grep -liH -e liasse
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2657 次 |
最近记录: |