grep-Alias ​​zum sicheren Ignorieren mehrerer Verzeichnisse

grep-Alias ​​zum sicheren Ignorieren mehrerer Verzeichnisse

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" {} +
)

( -Iund -Hsind GNU-Erweiterungen).

Benutzen als:

mygrep pattern dir1 dir2

(Stellen Sie sicher dir1, dass dir2sie nicht wie findPrädikate aussehen).

Entfernen Sie sie -exec sh...+, wenn Sie diese Warnmeldungen nicht interessieren.

Es ist keine gute Idee, dies grepals Aliasnamen zu verwenden, wenn Sie dessen Verhalten so drastisch ändern.

Wenn Sie Optionen übergeben müssen , können Sie die Variable wie folgt grepverwenden :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, mygrepOptionen grepmit 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 -- dirmygrep -f patternfile -- dir

verwandte Informationen