find -execの実行方法は?


477

現在のディレクトリで、「chrome」というテキストを含むファイルを見つけたいのですが。

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

私は何を間違えていますか?



私はfind: Only one instance of {} is supported with -exec ... +
コスタ

回答:


710

;\;シェルが解釈できないようにここでエスケープされました)またはa +とa が見つかりませんでした{}

find . -exec grep chrome {} \;

または

find . -exec grep chrome {} +

find実行されgrep{}見つかったファイル名に置き換えられます。違い;とは+していることである;、単一のgrep各ファイルのコマンドで実行され、一方、+できるだけ多くのファイルをパラメータとして与えられてgrep一度に。


30
\を使用する場合; 終了構文grepには一度に1つのファイルが渡されるため、デフォルトではファイル名は表示されず、一致した行のみが表示されます。代わりに、ファイルリストを取得するgrep -lsには、findコンストラクト内でuseを追加します。
カレブ

9
find . -exec grep foo {} +このような出力が表示されます./dir/file.py:from foo import bar
-sg

10
find . -exec grep foo {} \;このように、あなたの出力が表示されますfrom foo import bar
SG

9
find . -exec grep -l foo {} +このように、あなたの出力が表示されます./dir/file.py
SG

8
find . -exec grep -l foo {} \;このように、あなたの出力が表示されます./dir/file.py
SG

46

findこれに使用する必要はまったくありません。grepは、現在のディレクトリ内のすべてのglobリストからファイルを開くことができます。

grep chrome *

...またはフォルダーとその下のすべてに対して再帰的に:

grep chrome . -R

22
拡張がARG_MAXを超えると、grepは停止します。-Rは、特定のファイル(-nameなど)を除外するためのプリミティブを簡単に追加したり、サブツリーにアクセスしたりしない(-prune)ことができます。
メル

6
良い点@Mel。私のポイントは、おそらく、依頼者はfindいつgrep仕事をすることができるかを紹介することによって必要以上に複雑なことをしていましたが、外出する前にファイルリストを微調整するためにfindを使用することがより効果的であることですgrepに。
カレブ

4
@Mel grepはそのような場合に窒息しませんexec
クリスダウン

すべてのファイルが同じディレクトリにある場合にのみ機能し、サブディレクトリに分散している場合には機能しません。
矢場

1
@Yaba私の答えは、サブディレクトリに広がるファイルのケースを処理する方法を述べています。
カレブ

18
find . | xargs grep 'chrome'

次のこともできます。

find . | xargs grep 'chrome' -ls

最初の行はファイル内の行を示し、2番目の行はファイルのみをリストします。

Calebのオプションは、よりきれいで、キーストロークが少ないです。


11
問題xargsは、入力が生成されfindない特異な方法で引用されることを期待していることです。だから、find … | xargs …あなたが空白を含むか、ファイル名を持っている場合は動作しません\'"
ジル

3
@Gillesこのような問題を回避するにはfind . | xargs -n1 -iX grep "X" 'chrome'、引数を一度に1つずつ入力して引用するようにします。明らかにこれはこの例を処理するのに恐ろしく非効率的な方法ですが、状況によっては便利です。
カレブ

完全を期すために、「grep」で大文字と小文字を区別しない-iオプションも指定する必要があります。また、大文字と小文字を区別しないため、findに-inameがあります。
マシュー

9
@Caleb:xargsLinuxファイル名に対処するための唯一の100%信頼できる方法はfind ... -print0 | xargs -0、区切り文字としてNULを使用することです。代替- xargs -d '\n'セパレータとして改行を使用し、99%の信頼性。
悲しみ

私はこれを頻繁に使用しますが、ファイル名の非常に長いリストでは失敗し、その時点でfind -execが勝者になります。
スペースムース

5

検索は1つの方法であり、試してみることができthe_silver_searcherます。

ag chrome

すべてのファイル(サブディレクトリを含む)でchromeを検索し、findよりも高速です


また、pt(プラチナサーチャー、github.com / monochromegane / the_platinum_searcherから入手可能)もあります。これは、IMHOがより高速に処理します-ファイルが数個しかない場合は重要ではありません。
ホッピングバニー

1

行の代わりにファイルのリストを表示するには:

grep -l "chrome" *

または:

grep -r -l "chrome" .

1

ここに私が通常find / execを使用する方法の例があります...

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

これは、すべての.pyファイルを再帰的に検索し、ファイルごとに、ファイルごとにファイル名とfgrepの 'hello'を出力します。出力は次のようになります(今日1つ実行しました)。

./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 {} \; -それは一致したファイルのファイル名を印刷していない、と何もよ
ジェフ・シャラーは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.