我想递归且唯一地列出包含给定单词的文件。
例子:检查单词“check”,我通常做的是 grep
$ grep check * -R
但由于这个词出现很多次,所以我得到了很多输出。所以我只需要列出包含给定搜索词的文件名。我想用find
和来处理一些技巧xargs
就足够了,但不确定。
有任何想法吗?
答案1
使用-l
或--files-with-matches
选项,记录如下:
抑制正常输出;相反,打印通常会打印输出的每个输入文件的名称。扫描将在第一个匹配处停止。 (
-l
由 POSIX 指定。)
因此,对于您的示例,您可以使用以下内容:
$ grep check * -lR
答案2
find . -type f -exec grep -l check {} +
您可能不想使用-R
现代版本的 GNUgrep
在降序目录时遵循符号链接的选项。请使用该-r
选项,该选项自版本 2.12(2012 年 4 月)以来不再遵循符号链接。
如果您的 grep 不是 GNU 版本,或者版本早于 2.12,或者您需要将代码移植到非前沿 GNU 系统,请使用find
上面的命令。
否则,你可以这样做:
grep -rl check .
不要使用*
(因为这会忽略当前目录中的隐藏文件(并且仅在当前目录中),并且会导致名称以 开头的文件出现问题-
),避免在参数后传递选项,因为这不能保证根据环境正常工作并且不可移植。
答案3
尝试这个:
find . -type f | xargs grep -c check $1 | grep -v ":0"
至于grep
旗帜...
-c
将返回一个文件名,后跟 : 和一个数字,指示搜索字符串在给定文件中出现的次数。
-v
将获取第一次搜索的输出grep
,过滤掉结果为零的文件,并仅打印结果非零的文件。
答案4
grep -rin“whatToFind”locationToFINd
例如 $ grep -rin "vihaan" 。
将递归搜索并列出文件名以及其中包含“vihaan”、“.”的相应行。指当前目录。