grep エイリアスは、複数のディレクトリを安全に無視できます。

grep エイリアスは、複数のディレクトリを安全に無視できます。

毎日の使用量は次のとおりです。

grep -rIn pattern directory

時々 、この種のパスがあるディレクトリにあるファイルの中から避けたいファイルがあります:app/lib/bower/lodash、、、。app/lib/bower/paho-mqtt-jsapp/lib/bower/socket-io-client

理想的な解決策はパスで検出を実行することですが、app/lib/bower/これは困難です。可能ですか?

私は次のことを思い出しました。

alias grep='grep --exclude-dir={lodash,paho-mqtt-js,socket-io-client}'

十分です(新しいものを追加するにはメンテナンスが必要ですが)。 grepによってディレクトリが除外された場合、少なくともstderrに単純な警告を追加するにはどうすればよいですか?

ベストアンサー1

私は以下を使用しますfind

mygrep() (
  pattern=$1; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec grep -IHne "$pattern" {} +
)

-Iそして-HGNU拡張です)。

使用:

mygrep pattern dir1 dir2

dir1(そして述語dir2のように見えないことを確認してください)。find

-exec sh...+これらの警告メッセージが気に入らない場合は削除してください。

動作を大幅に変更するときにgrepエイリアスとして使用することはお勧めできません。

オプションをに渡す必要がある場合は、次の変数をgrep使用できますGREP_OPTIONS

GREP_OPTIONS=-i mygrep foo dir

ただし、このオプションのサポートは将来のバージョンで削除される予定であるため、オプションを専用の配列に渡すgrep方法を提供する方が良いかもしれません(シェルでサポートされている場合)。mygrepgrep

mygrep() (
  pattern=$1; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec \
    grep -IHne "${g[@]}" "$pattern" {} +
)

g=(-i --exclude-dir=.git); mygrep foo dir1 dir2

または、オプションが停止する場所を--通知するために使用されます。mygrep

mygrep() (
  grep_options=()
  for i do
    grep_options+=("$i")
    shift
    [ "$i" != "--" ] || break
  done
  pattern=${1?need a pattern}; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec \
    grep -H "${grep_options[@]}" "$pattern" {} +
)

mygrep -nI --exclude-dir=.git -- pattern dir1 dir2

--(そして、ファイルを除外したい場合など、オプションの引数として渡さないでください。たとえば、代わりに使用します。--これは、またはなどの使用法も除外します)。--exclude=----exclude --mygrep -e pattern1 -e pattern2 -- dirmygrep -f patternfile -- dir

おすすめ記事