2014-11-04 163 views
4

我知道我可以搜索字符串:unix命令行...如何grep并只显示包含字符串的文件名?

grep -n -d recurse 'snoopy' * 

,然后显示一个包含该字符串,像每一个文件名,例如:

file/name.txt:23 some snoopy here 
file/name2.txt:59 another snoopy there 
file/name2.txt:343 some more snoopy 
etc... 

的问题是,有许多事件,该名单是巨大的。我如何让它只显示包含字符串的实际文件名,没有重复且没有发生?

只有像:

file/name1.txt 
file/name52.txt 
file/name28293.txt 

非常感谢任何帮助:)

+2

您使用'-l'参数。 – 2014-11-04 21:07:03

回答

11

-l标志(或者,在这两个BSD和GNU grep--files-with-matches)你想要做什么。

the POSIX spec

写入仅含有选定的行到标准输出的文件的名称。每个搜索的文件都应写入一次路径名。如果搜索到标准输入,则应在POSIX语言环境中写入“(标准输入)”的路径名。在其他语言环境中,“标准输入”可能会被这些语言环境中更适合的内容替代。

BSD和GNU都明确保证这样会更有效率。 (Older BSD版本说“... grep将只搜索一个文件,直到找到一个匹配,使搜索可能更便宜,newer BSDGNU说”扫描将停止在第一场比赛“。)如果你不知道哪个grep你有和它有哪些选项,只需在shell中键入man grep,你应该得到该manpage。

+1

'-l'选项也在第七版UNIX中,因此它在任何地方都可用。 – 2014-11-04 21:17:58

+0

@JonathanLeffler:'busybox'和其他类似的all-in-one-micro-userland中的'grep'是否有'-l'?我正在尝试查找文档,但是每台'busybox'机器都有内置禁用,并且'/ bin/grep'或'/ usr/bin/grep'是GNU版本... – abarnert 2014-11-04 21:21:23

+0

准确答案:我不知道。然而,声称是'grep'的内置替代品,它几乎必须支持'-l'。它作为一个单独的可执行文件的一个原因是''grep'中可能有太多的代码。如果它包含多个正则表达式包(PCRE以及倾向于包含的各种其他包),那就更是如此。 – 2014-11-04 21:24:18