Ich versuche, rekursive Unterstützung hinzuzufügen zu meinemFilegrep-Skript.
Aus irgendeinem Grund funktioniert dies nicht wie erwartet:
RECURSIVE_MODE=off
# iterate over args
for ARG in "$@"
do
if [ -d "$ARG" ] && [ $RECURSIVE_MODE = on ] ; then
# recursive call
$0 $GREP_ARGS $ARG/*
elif [ -f "$ARG" ]; then
filecat "$ARG" | grep $GREP_ARGS | sed "s#^#$ARG: #"
else
[ "$ARG" = "-r" ] && RECURSIVE_MODE=on
# append to the current grep args
GREP_ARGS="$GREP_ARGS $ARG"
fi
done
Aus Gründen der besseren Lesbarkeit möchte ich in diesem Fall auf die Verwendung von Funktionen verzichten.
BEARBEITEN: Das Skript sollte folgendermaßen funktionieren:
für jedes übergebene Argument:
- Wenn das aktuelle Argument ein Verzeichnis ist, prüfen Sie, ob der rekursive Modus aktiviert ist, und führen Sie wenn ja den rekursiven Aufruf aus.
- andernfalls, wenn das aktuelle Argument eine Datei ist,
grep
mit dem aktuellen Muster aufrufen; - andernfalls wird davon ausgegangen, dass es sich beim aktuellen Argument um ein Grep-Muster oder einen Grep-Schalter handelt, und es wird an die aktuelle
$GREP_ARGS
Liste angehängt.
Das ist vielleicht nicht ganz zuverlässig, aber für mich funktioniert es gut als Ersatz für zgrep
, pdfgrep
, usw.
Antwort1
Versuchen Sie, die -H
folgende Option zu verwenden grep
:
-H, --with-filename Print the filename for each match.
Anstatt Ihr Skript aufzurufen, tun Sie einfach Folgendes:
grep -H PATTERN [FILE...]
Außerdem ist es eine gute Idee, die Manpage des von Ihnen verwendeten Tools zu prüfen, bevor Sie versuchen, ein Wrapper-Skript zu schreiben. Bei gängigen Unix-Tools sind die gewünschten einfachen Optionen fast immer bereits im Tool integriert.
Antwort2
Ich habe endlich das Problem gefunden, dass grep
mit dem -r
Schalterignoriert stdin und sucht stattdessen im aktuellen Arbeitsverzeichnis. Um das Lesen von Standardeingaben zu erzwingen, habe ich einfach Folgendes hinzugefügt -
:
filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"