grep -ril、最上位ディレクトリを一度だけ表示

grep -ril、最上位ディレクトリを一度だけ表示

grep -rilだからフォルダにしたいです。一致する親フォルダだけを返したいです。

表示するには:

/tmp/: grep -ril "hello"

返品:

tmp1/banan/file
tmp1/banan2/file
tmp2/ape/file
tmp2/ape2/file

予想される結果:

tmp1
tmp2

答え1

最初のレベルのディレクトリのみを印刷したい場合は、そのディレクトリで最初の一致を見つけてすぐに終了する方が効率的です。これを達成するためにこれを使用できます-q。成功すると一致を返し、そうでなければ失敗し、それを-r組み合わせると一致が見つかるとすぐに終了します。

for d in */; do grep -qri "hello" -- "$d" && printf "%s\n" "$d"; done

--オプションの終わりを示すために使用されるので、以下は指定されたディレクトリを保護し、オプション-somethingとして解釈できるファイル引数です。

for上記をで始まるディレクトリと一致させるには、.設定を検討してくださいshopt -s dotglobこれ

/出力から末尾を削除する必要がある場合は、bash引数拡張を使用して"$d"代わりにprintを使用できます"${d%/}"

答え2

ディレクトリはコンテンツパターンと一致しません。あなたが尋ねるのは、パターンに一致するファイルのディレクトリを取得する方法です。

最初のコンポーネントの背後にあるパスを削除し、結果が指定した順序で一意の値で表示されることを確認してください。

grep -ril "hello" | sed 's!/.*$!!' | sort -u

結果の順序を変更したくない場合は、次のようsortに置き換えます。awk '!h[$0]++'

関連情報