我想在当前目录中找到包含“ chrome”文本的文件。

$ find . -exec grep chrome
find: missing argument to `-exec'


我做错了什么?

评论

相关:unix.stackexchange.com/q/321697/135943

我发现:-exec仅支持{}的一个实例... +

相关:如何在查找中使用-exec

#1 楼

您错过了;(这里为\;进行转义以防止外壳程序解释它)或+{}
find . -exec grep chrome {} \;


find将执行grep,并将{}替换为找到的文件名。 ;+之间的区别在于,使用;对每个文件执行单个grep命令,而对于+,一次将尽可能多的文件作为参数提供给grep

评论


如果使用\;结束结构grep一次传递一个文件,因此默认情况下它不显示文件名,仅显示匹配的行。要获取文件列表,请在find结构中使用grep -ls。

–卡莱布
2011年5月10日下午6:55

找 。 -exec grep foo {} +将向您显示这样的输出。/dir/file.py:来自foo导入栏

– g
2015年4月17日在20:30

找 。 -exec grep foo {} \;将显示您从foo导入栏输出的输出

– g
15年4月17日在20:31

找 。 -exec grep -l foo {} +将向您显示这样的输出。/dir/file.py

– g
15年4月17日在20:32

找 。 -exec grep -l foo {} \;将显示这样的输出./dir/file.py

– g
15年4月17日在20:33

#2 楼

您根本不需要使用find; grep能够从当前目录中所有内容的全局列表中打开文件:

grep chrome *


...甚至可以递归地获取文件夹及其下的所有内容:

grep chrome . -R


评论


如果扩展超过ARG_MAX,则grep将阻塞。 -R将访问所有内容,而使用find可以更轻松地添加原语以排除某些文件(-name等),甚至不访问子树(-prune)。

–梅尔
2011年5月9日23:58

好点@梅尔。我的观点是,当grep可以完成工作时,要求方很可能会通过引入find来使事情变得比他们需要的复杂,但是在某些情况下,使用find来对文件列表进行细化会更有效。出去grep。

–卡莱布
2011年5月10日下午6:53

@Mel grep在这种情况下不会阻塞,exec会阻塞。

–克里斯唐(Chris Down)
13年3月26日在6:21

@Yaba我的答案指出了如何处理跨子目录分布的文件的情况。

–卡莱布
18-09-14在12:56

@DaCheetah这是一个误解-上面的注释与find -exec没有关系。此处的exec指的是直接调用execve syscall的libc函数(例如exec {ve,vp,lp,...}),而不是查找-exec自己先进行操作的函数。关键是grep甚至都没有看到要扼杀它们的参数,这是内核拒绝了它。

–克里斯唐(Chris Down)
5月4日15:31



#3 楼

find . | xargs grep 'chrome'


还可以:

find . | xargs grep 'chrome' -ls


第一个显示文件中的行,第二个显示文件中的行。

Caleb的选择更整洁,击键次数更少。

评论


xargs的问题在于,它希望输入的内容以一种独特的方式被引用,而find不会产生这种方式。因此找到…|如果文件名包含空格或\'“,则xargs…不起作用。

–吉尔斯'所以-不再是邪恶的'
2011年5月10日下午6:31

@Gilles您可以使用诸如find之类的方法来解决该问题。 | xargs -n1 -iX grep“ X”'chrome',以便一次输入一个参数并用引号引起来。显然,这是处理此示例的一种极其低效的方法,但是在某些情况下,这很好。

–卡莱布
2011年5月10日,11:56

为了完整起见,我们还应提及-i选项,以使'grep'不区分大小写。对于不区分大小写的内容,也可以找到-iname。

–马修
2011年5月10日12:01

@Caleb:使xargs处理Linux文件名的唯一100%可靠的方法是找到... -print0 | xargs -0,使用NUL作为分隔符。备选-xargs -d'\ n'使用换行符作为分隔符,可靠性为99%。

–user1686
2011年5月10日20:18



我经常使用它,但是对于很长的文件名列表,它将失败,这时find -exec成为赢家。

–Spacemoose
15年7月5日在9:08

#4 楼

查找是一种方法,您可以尝试the_silver_searcher,然后只需做

ag chrome


它将在所有文件(包括子目录)中搜索chrome,并且比找到

评论


还有pt(铂金搜索程序,可在github.com/monochromegane/the_platinum_searcher上找到),恕我直言,它的工作速度更快-如果只有几个文件,可能没关系。

–跳兔子
18年11月14日在4:40

#5 楼

这是我通常如何使用find / exec的示例。
s)删除该文件的文件名和fgrep的“ hello”(每个文件)。输出看起来像(今天只运行了一个):

find  . -name "*.py" -print -exec fgrep hello {} \;


评论


不要弄乱您的工作流程,但您可能会喜欢:find。 -name“ * .py” -exec fgrep -l hello {} \; -它将打印匹配的文件的文件名,仅此而已

– Jeff Schaller♦
17年8月23日在16:19

#6 楼

要查看文件列表而不是行:

grep -l "chrome" *


或:

grep -r -l "chrome" .