再帰検索を実行すると、grepは相対ファイルパスを印刷します。

再帰検索を実行すると、grepは相対ファイルパスを印刷します。

私はこのプロジェクトがどのバージョンの休止状態に依存しているかを調べようとしています(私の質問に直交しています)。

私たちはいくつかのサブプロジェクトを含む親プロジェクトを持っており、これが1つ以上のプロジェクトにあることを知っていますpom.xml。問題は、一致を印刷するとその行だけが表示され、pom.xmlI want to Know which Child Projectで見つかったことですpom.xml

相対パスを印刷するにはどうすればよいですかgrep? (絶対パスも機能しますが、表示が悪いです。)これが可能でない場合は、他の提案を歓迎します。

$ grep -rI -3 org.hibernate pom.xml

答え1

find、xargs、およびgrepを一緒に使用することをお勧めします。

 cd top-dir
 find . -print -name 'pom.xml' -print0 | xargs -0 grep -l pattern

見つかったディレクトリの特殊文字が保護され、正しく処理されるように -print0/-0 オプションを入れました。

上記は、パターンと一致する最上位ディレクトリに基づいてファイル名をリストします。

答え2

grep --with-filename -rI -3 org.hibernate pom.xml

マニュアルページから:

       -H, --with-filename
          Print  the  file  name for each match.  This is the default when there is more than one file to
          search.

答え3

globstar別の解決策はパターンを使用することです。再帰グローバルgrep -H出力にファイル名を含むオプションと一緒に使用されます。

shopt -s globstar
grep -H org.hibernate **/pom.xml

再帰grep-R)とは異なり、この-Hオプションにはこの方法を使用するときに出力にファイルパスが含まれます。

ヒント:再帰を永久に許可するには、ワイルドカードを追加すると便利shopt -s globstarです.bashrc

答え4

次のコマンドを使用します。

cat */demo.txt | grep -Rli 'demo'

このコマンドはファイルのパスを返します。

関連情報