Der tägliche Gebrauch ist:
grep -rIn pattern directory
Es gibt einige Dateien, die ich vermeiden möchte, weil sie sich in Verzeichnissen befinden, die irgendwann diesen Pfadtyp enthalten: app/lib/bower/lodash
, app/lib/bower/paho-mqtt-js
, app/lib/bower/socket-io-client
.
Die ideale Lösung ist die Erkennung app/lib/bower/
im Pfad, aber das ist schwierig. Ist das möglich?
Mir ist Folgendes eingefallen:
alias grep='grep --exclude-dir={lodash,paho-mqtt-js,socket-io-client}'
Gut genug (muss allerdings gewartet werden, wenn neue Inhalte hinzugefügt werden). Wie kann man zumindest eine kurze Warnung in stderr einfügen, wenn das Verzeichnis von grep ausgeschlossen wird?
Antwort1
Ich würde verwenden 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
und -H
sind GNU-Erweiterungen).
Benutzen als:
mygrep pattern dir1 dir2
(Stellen Sie sicher dir1
, dass dir2
sie nicht wie find
Prädikate aussehen).
Entfernen Sie sie -exec sh...+
, wenn Sie diese Warnmeldungen nicht interessieren.
Es ist keine gute Idee, dies grep
als Aliasnamen zu verwenden, wenn Sie dessen Verhalten so drastisch ändern.
Wenn Sie Optionen übergeben müssen , können Sie die Variable wie folgt grep
verwenden :GREP_OPTIONS
GREP_OPTIONS=-i mygrep foo dir
Beachten Sie jedoch, dass die Unterstützung für diese Option in zukünftigen Versionen von entfernt wird grep
. Eine bessere Option könnte daher darin bestehen, eine Möglichkeit zu schaffen, mygrep
Optionen grep
mit einem dedizierten Array an like zu übergeben, sofern Ihre Shell dies unterstützt:
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
Oder verwenden Sie --
, um anzugeben mygrep
, wo die Optionen enden:
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
(und stellen Sie sicher, dass Sie keine optionalen Argumente übergeben --
. Wenn Sie beispielsweise --
Dateien ausschließen möchten, verwenden Sie --exclude=--
und nicht . Dadurch werden auch Verwendungen wie oder ausgeschlossen .)--exclude --
mygrep -e pattern1 -e pattern2 -- dir
mygrep -f patternfile -- dir