web-dev-qa-db-ja.com

「where」句と同等の「find」と「grep」を使用する方法

テキストファイルのフォルダーツリーがあり、部分文字列のインスタンスとそれらのファイルの名前を見つけたいのですが。

私が次のようなことをした場合:

find . | xargs cat | grep 'abc'

次に、部分文字列のインスタンスを検索しますが、元のファイルは見つかりません。

助けてくれてありがとう!

3
ak0000

ランニング xargs catのように、ファイル名が失われ、データが流れると同時にパイプラインを介してそれらを渡す良い方法はありません。

だが grep -lは、一致する文字列を持つファイルの名前を一覧表示するので、次のように使用できます。

find . -type f | xargs grep -l hello

または、単にgrep -rディレクトリを再帰的に調査し、空白や引用符を含むファイル名でのxargsの問題も解決します。

grep -lre abc .

ファイル名だけでなく、一致する文字列も必要な場合は、-l通常のgrep動作を取得します。 -r、コマンドラインでパスを1つだけ指定しても、一致するファイル名も出力するはずです。

8
ilkkachu

xargsは不要です。あなたがするときxargs cat | grepgrepは、すべてのファイルの連結コンテンツを含む名前のない入力ストリームのみを表示します。代わりに:

find . -type f -exec grep -H 'abc' {} +

これにより、各ファイルでgrepが呼び出されます(パラメータとして複数のファイルを指定してgrepを呼び出すことにより、grepのインスタンスの数が最小限になります)。

7
xenoid
find ./ -type f -exec grep -H abc {} \;

または

grep -R 'abc' ./
3
PotroNik

awkcatの代わりにgrepを試してください

find . -type f | xargs awk '/abc/{printf "%s is from %s\n", $0, FILENAME}'

または、findawkを使用する

find . -type f -exec awk '/abc/{printf "%s is from %s\n", $0, FILENAME}' {} +
2
Jetchisel

Grepは複数のファイル名を取得してファイルを読み取り、複数の引数を使用するとファイル名を表示するため、ファイル名リストを直接渡します。

また、ディレクトリをgrepに渡さないでください。また、ファイル名に特殊文字を使用しないように、ヌル終了ファイル名を使用してください。

find . -type f -print0 | xargs -0 grep 'abc'
2
Paul_Pedant