grep foo bar.txt
を実行すると、grepはbar.txt
で出現する「foo」をそれぞれ強調表示します。しかし、find
を使用して、grepが検索するファイルを判別したい場合があります。だから私はこのようなことをします:
find . -iname "*.abc" | xargs grep foo
またはこれ:
find . -iname "*.abc" -exec grep foo {} \;
どちらの場合も、grepは指定されたファイルで「foo」の出現を正しく検出しますが、出力には強調表示がまったくありません。
find
を使用して、ハイライトを失うことなく検索するgrepのファイルを選択するにはどうすればよいですか?
Ubuntu 12.04でGnomeターミナル3.4.1.1を実行しており、シェルとしてbashを使用しています。
どちらのコマンドでも、問題はgrep
ではなく、別のコマンドが実際の出力を生成することです(それぞれ、xargs
とfind
)。
これを解決するには、ファイル名ごとにgrep
を直接呼び出します。
_IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
grep foo $FILE
done
unset IFS
_
またはワンライナーとして:
_IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS
_
_IFS=$'\n'
_は、内部フィールド区切り文字を改行文字に設定します(または、ファイル名のスペースによって問題が発生します)。
for FILE in $(COMMAND); do COMMANDS done
は、COMMAND
で指定されたファイルをループし、変数FILE
を現在のファイルに設定し、COMMANDS
を実行します。
_grep foo $FILE
_は_$FILE
_でfoo
を検索し、結果を直接画面に送信します。
_unset IFS
_は、内部フィールドセパレータをデフォルト値に戻します(スクリプトでは必要ありません)。
出力をもう一度grep
して、色を付けます。
私はここで同様のことをしました: grepから一致に関する追加データを取得します