毎日の使用量は次のとおりです。
grep -rIn pattern directory
時々 、この種のパスがあるディレクトリにあるファイルの中から避けたいファイルがあります:app/lib/bower/lodash
、、、。app/lib/bower/paho-mqtt-js
app/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
そして-H
GNU拡張です)。
使用:
mygrep pattern dir1 dir2
dir1
(そして述語dir2
のように見えないことを確認してください)。find
-exec sh...+
これらの警告メッセージが気に入らない場合は削除してください。
動作を大幅に変更するときにgrep
エイリアスとして使用することはお勧めできません。
オプションをに渡す必要がある場合は、次の変数をgrep
使用できますGREP_OPTIONS
。
GREP_OPTIONS=-i mygrep foo dir
ただし、このオプションのサポートは将来のバージョンで削除される予定であるため、オプションを専用の配列に渡すgrep
方法を提供する方が良いかもしれません(シェルでサポートされている場合)。mygrep
grep
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 -- dir
mygrep -f patternfile -- dir