$ find . -exec grep chrome
find: missing argument to `-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" .
评论
相关:unix.stackexchange.com/q/321697/135943我发现:-exec仅支持{}的一个实例... +
相关:如何在查找中使用-exec