如何运行find -exec?


Answers:


710

您错过了a ;\;为了防止shell解释而在此处进行了转义)或a +和a {}

find . -exec grep chrome {} \;

要么

find . -exec grep chrome {} +

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


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

9
find . -exec grep foo {} +将显示这样的输出./dir/file.py:from foo import bar
sg 2015年

10
find . -exec grep foo {} \;将显示这样的输出from foo import bar
sg 2015年

9
find . -exec grep -l foo {} +将显示这样的输出./dir/file.py
sg 2015年

8
find . -exec grep -l foo {} \;将显示这样的输出./dir/file.py
sg 2015年

46

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

grep chrome *

...甚至递归地查找文件夹及其下的所有内容:

grep chrome . -R

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

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

4
@Mel grep在这种情况下不会窒息,exec而是。
克里斯·

仅在所有文件都在同一目录中的情况下才起作用,而在它们分散在子目录中时才起作用。
Yaba

1
@Yaba我的答案指出了如何处理散布在子目录中的文件的情况。
卡勒布

18
find . | xargs grep 'chrome'

您也可以:

find . | xargs grep 'chrome' -ls

第一个向您显示文件中的行,第二个仅列出文件。

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


11
问题xargs在于它希望输入的输入find不会产生特殊的方式。因此find … | xargs …,如果文件名包含空格或,则无法使用\'"
吉尔斯

3
@Gilles您可以使用类似的方法来解决该问题,find . | xargs -n1 -iX grep "X" 'chrome'以便一次提供一个参数并将其引号。显然,这是处理此示例的一种极其低效的方法,但是在某些情况下,这很好。
卡莱布

为了完整起见,我们还应该提及-i选项,以使'grep'不区分大小写。对于不区分大小写的内容,还存在-iname。
马修(Mathew)

9
@Caleb:xargs应对Linux文件名的唯一100%可靠的方法是find ... -print0 | xargs -0使用NUL作为分隔符。替代方案- xargs -d '\n'使用换行符作为分隔符,可实现99%的可靠性。
grawity

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



1

这是我通常如何使用find / exec的示例。

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

这将以递归方式搜索所有.py文件,并为每个文件打印出文件名和fgrep的文件(对于每个文件)中的“ hello”。输出看起来像(今天只运行了一个):

./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"

1
不会打乱您的工作流程,但是您可能会喜欢:find . -name "*.py" -exec fgrep -l hello {} \; -它会打印匹配的文件的文件名,而没有其他任何东西
Jeff Schaller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.