grepはディレクトリパスのみを返します。

grepはディレクトリパスのみを返します。

私はgrepを使って大きなディレクトリを検索していますが、問題は正規表現を満たすディレクトリだけが必要だということです。ファイル名は必要ありません。

私が使用するgrepコマンドは次のとおりです。

grep -Erin "RegEx" * > outputfile.txt

答え1

@RalfFriedlによれば、正規表現に一致するファイルのディレクトリ名だけが必要な場合は、dirnameを使用できます。ディレクトリに複数のファイルがある場合は、sortを使用して出力をソートされた一意のリストに縮小できます。このように:

dirname $(grep -Eril "RegEx" *) | sort -u

答え2

Grepにはこのオプションはありません。

ファイル名が必要ない場合、なぜ-n行番号オプションを使用するのですか?

一致するファイル名を一覧表示するオプションがあります。

-l, --files-with-matches は
通常の出力を抑制します。代わりに印刷すると、通常は各入力ファイルの名前が印刷されます。検索は最初の一致で停止します。

sedファイル名の最後の部分を削除し、ディレクトリ部分のみを保持できます。各ディレクトリを一度だけ一覧表示するには、出力を実行しますsort -u

答え3

このコマンドを試してくださいfind

find . -type d -regextype posix-extended -regex 'RegEx'

パス名と一致するようにposix拡張を使用して、現在のディレクトリでディレクトリタイプのコンテンツを見つけます(grep -Eと同じ)。

答え4

# usage: dgrep regex dir
dgrep(){
        find "$2" -type d -print0 | xargs -0 sh -c '
                rex=$1; shift
                for d; do grep -sq "$rex" "$d"/* "$d"/.[!.]* && echo "$d"; done
        ' sh "$1"
}

grep -rl+ソリューションとは異なり、sedこれは最初の一致が見つかるまでディレクトリ内のファイルのみを検索します。データによっては、作業速度が大幅に向上する可能性があります。

-sq後ろにgrepオプションを自由に追加します。コマンドラインからスクリプトを渡すことができますが、これによりすべてが複雑になり、利点はほとんどありません。

関連情報