テキストファイルのフォルダーツリーがあり、部分文字列のインスタンスとそれらのファイルの名前を見つけたいのですが。
私が次のようなことをした場合:
find . | xargs cat | grep 'abc'
次に、部分文字列のインスタンスを検索しますが、元のファイルは見つかりません。
助けてくれてありがとう!
ランニング xargs cat
のように、ファイル名が失われ、データが流れると同時にパイプラインを介してそれらを渡す良い方法はありません。
だが grep -l
は、一致する文字列を持つファイルの名前を一覧表示するので、次のように使用できます。
find . -type f | xargs grep -l hello
または、単にgrep -r
ディレクトリを再帰的に調査し、空白や引用符を含むファイル名でのxargs
の問題も解決します。
grep -lre abc .
ファイル名だけでなく、一致する文字列も必要な場合は、-l
通常のgrep
動作を取得します。 -r
、コマンドラインでパスを1つだけ指定しても、一致するファイル名も出力するはずです。
xargs
は不要です。あなたがするときxargs cat | grep
、grep
は、すべてのファイルの連結コンテンツを含む名前のない入力ストリームのみを表示します。代わりに:
find . -type f -exec grep -H 'abc' {} +
これにより、各ファイルでgrep
が呼び出されます(パラメータとして複数のファイルを指定してgrep
を呼び出すことにより、grep
のインスタンスの数が最小限になります)。
find ./ -type f -exec grep -H abc {} \;
または
grep -R 'abc' ./
awk
とcat
の代わりにgrep
を試してください
find . -type f | xargs awk '/abc/{printf "%s is from %s\n", $0, FILENAME}'
または、find
とawk
を使用する
find . -type f -exec awk '/abc/{printf "%s is from %s\n", $0, FILENAME}' {} +
Grepは複数のファイル名を取得してファイルを読み取り、複数の引数を使用するとファイル名を表示するため、ファイル名リストを直接渡します。
また、ディレクトリをgrepに渡さないでください。また、ファイル名に特殊文字を使用しないように、ヌル終了ファイル名を使用してください。
find . -type f -print0 | xargs -0 grep 'abc'