Ich verwende FreeBSD und verstehe und verwende die -prune
Option „on“, find
um zu verhindern, dass der Befehl in ein Unterverzeichnis wechselt. Aber ich finde die erforderliche Syntax sehr umständlich und unpraktisch. Es verhindert auch nicht, dass das beschnittene Verzeichnis selbst angezeigt wird, was zwar behebbar, aber ärgerlich ist.
Ich möchte ein kurzes Skript/Alias erstellen, das -noenter
dem find
Befehl ein neues Argument hinzufügtWennEs wird (der Einfachheit halber) vor allen anderen Vorwahlen angegeben.
Das Ziel besteht darin, dass ich Folgendes eingeben kann:
find -xs /dir -noenter '$*' -name '*.conf' -ls
find -x -s /dir -noenter '$*' -name '*.conf' -ls
und es konvertiert die Argumente und führt aus:
/usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
/usr/bin/find -x -s /dir \( SNIPPED \) -ls
ich kann aber auch wie gewohnt einen beliebigen Routinebefehl „find“ eingeben und dieser wird transparent zur /usr//bin/find
Ausführung weitergeleitet.
Logischerweise muss das Skript das erste Argument nach dem Verzeichnisnamen identifizieren und dann testen, ob es Folgendes ist:
- ... gleich
-noenter
und gefolgt von mindestens 2 weiteren Argumenten (in diesem Fall weiß ich, wie ich das Argument erstelle, an das ich übergeben muss,/usr/bin/find
da ich weiß, welche Argumente davor/danach kamen);oder - ... gleich,
-noenter
aber nicht gefolgt von mindestens 2 weiteren Argumenten (= Fehler);oder - … alles andere oder Verzeichnis war das letzte Argument oder wurde nicht gefunden (= gesamte Originalargumente unverändert übergeben
/usr/bin/find
).
Ich kann das alles tun, bis auf eine Sache: Wie codiere ich den Teil des Skripts, der argv untersucht, um festzustellen, welche Argumentnummer (falls vorhanden) das dir
Argument ist?
Ich wähle eine Shell sh
für Skripting.
Antwort1
Wenn Sie die Existenz und Position eines bestimmten Arguments testen möchten, müssen Sie nur die Befehlszeile analysieren und jedes Argument auf eine Übereinstimmung mit Ihrem „erwarteten“ Wert prüfen. Sie müssen also jedes Argument auf den Wert testen -noenter
und dann eine Zeile drucken, die die Position und den Namen der Variable angibt -noenter
:
for i in `seq 1 $#`; do
ref=`eval "echo \\$$i"`
if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done
Jetzt das Gleiche, nur wird die Position des Arguments -noenter
in gespeichert $mitsos
und die Position des Arguments davor in $mary
:
for i in `seq 1 $#`; do
ref=`eval "echo \\${$i}"`
if [ $ref == '-noenter' ]; then
mitsos=$i
eva=$(($i-1))
mary=`eval "echo \\${$eva}"`
break
fi
done
und $mitsos
hat jetzt die Position von -noenter
oder keinen Wert und $mary
den Wert des Arguments vor -noenter
. An diesem Punkt $mary
hat if den Wert , /dir
den Siewissendas nächste Argument ist -noenter
und Sie können mit Ihrer Implementierung von fortfahren find
, andernfalls verwenden Sie die Version des Systems oder drucken eine Fehlermeldung. Wenn Ihnen die Position von egal ist, -noenter
können Sie die Zeile weglassen mitsos=$i
.