2009-09-01 15 views

答えて

12

ファイル名(find commandの出力)をegrepに入力します。実際には、ファイルの内容にegrepを実行する必要があります。

find . -name "*.txt" -exec egrep mystring {} \; 

または

find . -name "*.txt" -print0 | xargs -0 egrep mystring 

チェックfind command helpは、単一の引数が何をチェックして、より良い:ここで

は選択肢のカップルです。
最初の方法はすべてのファイルに対して新しいプロセスを生成し、2番目の方法は複数のファイルをegrepの引数として渡します。潜在的に厄介なファイル名に対処するために-print0と-0フラグが必要です(たとえば、ファイル名にスペースが含まれていてもファイル名を正しく区切ることができます)。

egrep*.txtファイルへのパスだけです find . -name *.txtによって生成された出力内 mystringを検索するように動作しません
+0

最初のコマンドの最後に '\ +'や '\;'がありません。 – spatz

+0

これはmystring内のファイル名を検索しようとしませんか?私は彼が別の方法を探していると思う。 – Kevin

+0

@spatz:この感謝の言葉をありがとう、私は例を修正した。 –

2

試しMYSTRING

まず

を、*.txtは、まずあなたの現在のディレクトリ内のファイルのリストを与え、シェルによって展開されますこれは.txtで終了します。たとえば、次のような場合は次のようになります。

[[email protected]:~]$ ls *.txt 
test.txt 
[[email protected]:~]$ 
findコマンドは find . -name test.txtになります。ただ、説明するために、次の試してください。

第二
[[email protected]:~]$ echo find . -name *.txt 
find . -name test.txt 
[[email protected]:~]$ 

を、egrepSTDINからファイル名を取ることはありません。それらを使用する引数に変換するにはxargs

+0

私はまた、次のパターンを囲むことをお勧め - シェルがパターンマッチングを行うのを防ぐために引用符で囲んだ名前 –

+0

このような包括的な答えを提供してくれた皆さんに感謝します。 – Tolga

1
find . -name *.txt | egrep mystring 

代わりに、あなたはxargsを使用することができます。

find . -name *.txt | xargs egrep mystring 
1

あなたは

find . -iname *.txt -exec egrep mystring \{\} \; 
1

を使用することができます。ここERRORで始まる行を持っているすべての*.logファイルのファイルパスを返します例です:

find . -name "*.log" -exec egrep -l '^ERROR' {} \; 
1

あなたはファイル名のみをしたい場合は、

+0

これは機能しません。 -Rオプションは、引数リストで指定されている場合にのみ、ディレクトリに再帰的に適用されます。この場合、それらのディレクトリ内のすべてのファイルは、.logで終わるファイルだけでなく読み込まれます。この方法で成功した場合は、シェルが* .logを解析するため、現在のディレクトリに.logで終わるファイルがあるためです。 –

+0

おそらく 'egrep -R 'パターン" --include = *。log .'? – moala

1

egrep -R "pattern" *.log 
を使用することができますegrepのからの再帰的なオプション:

find . -type f -name '*.txt' -exec egrep -l pattern {} \; 

したい場合は、ファイル名と一致:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \; 
関連する問題