Ich möchte, dass meine Bash "gefunden" nur druckt, wenn etwas gefunden wird, indem ich den Befehl find verwende. Aber die Verwendung von && hilft nicht: Selbst wenn nichts gefunden wird, werde ich "gefunden" gedruckt. Beispiel:
$ pwd
/data/data/com.termux/files/home/test/test1/test4
$ ls
xaa xab
$ find . -name xac && echo 'found'
found
$ find . -name xaa && echo 'found'
./xaa
found
command-line
find
Josef Klimuk
quelle
quelle
/some/path
sagt find, wo man anfangen soll zu suchen, aber nichts sagt ihm, wonach er suchen soll. Gleiches gilt für Ihre verknüpfte Antwort. Was für mich funktioniert, istfind /some/path -name xac -print0 -quit | grep -qz . && echo found
. Habe ich etwas verpasst?-print0 -quit
. Was Sie davor setzen, hängt davon ab, was Sie finden möchten. Ich habe beschlossen, das hier wegzulassen.Die Antwort von muru ist angemessen und gut geeignet für Fälle, in denen wir etwas drucken möchten, wenn eine Datei gefunden wird. Für den allgemeinen Fall, wenn wir einen externen Befehl ausführen möchten, z. B.
echo
könnten wir-exec
flag verwenden.Der
{}
Teil übergibt den Dateinamen an den Befehl zwischen-exec
und\;
als Argumente. Beachten Sie das\
Vorherige;
- es verhindert, dass die Shell es falsch interpretiert. ; Im Semikolon zum Schließen der Shell bedeutet das Ende des Befehls. Wenn es jedoch mit einem Schrägstrich versehen wird, behandelt die Shell es als Literall-Text, der an denfind
Befehl übergeben wird, und um den Befehl zu finden, dient es als-exec
Argument für das Schließen des Flags.Für die Erstellung von Bedingungen dieser
if found do this; else do that
Art könnten wir Befehlssubstitution$()
undtest
Befehl (aka[
) verwenden:Adressierung von Dans Kommentar
Dan fragte in den Kommentaren :
Lassen Sie uns zuerst das Problem verstehen. Normalerweise gibt es in Shells das Konzept der Wortteilung, was bedeutet, dass nicht zitierte Variablen und Positionsparameter erweitert und als separate Elemente behandelt werden. Wenn Sie Variable Zum Beispiel haben
var
und es enthälthello world
Text, wenn Sie tun ,touch $var
die Schale wird es brechen in zwei separate Elementehello
undworld
undtouch
wird das verstehen , als ob Sie versuchen , zwei separate Dateien zu erstellen; Wenn Sie dies tuntouch "$var"
, wird die Shellhello world
als eine Einheit behandelt undtouch
nur eine Datei erstellt. Dies ist wichtig zu verstehen, dass dies nur aufgrund der Funktionsweise von Muscheln geschieht.Im Gegensatz dazu
find
leidet es nicht unter einem solchen Verhalten, da Befehle vonfind
selbst verarbeitet und perexecvp()
Systemaufruf ausgeführt werden , sodass keine Shell beteiligt ist. Während geschweifte Klammern in Muscheln eine besondere Bedeutung haben, weil sie in der Mitte desfind
Befehls und nicht am Anfang erscheinen, haben sie in diesem Fall keine besondere Bedeutung für Muscheln. Hier ist ein Beispiel. Lassen Sie uns ein paar schwierige Dateinamen erstellen und versuchen, sie als Argument an denstat
Befehl zu übergeben.Wie Sie sehen können, werden
stat
schwierige Dateinamen problemlos verwendet. Diesfind
ist einer der Hauptgründe, warum dies für die Verwendung in tragbaren Skripten empfohlen wird. Dies ist besonders nützlich, wenn Sie den Verzeichnisbaum durchlaufen und möglicherweise mit Dateinamen arbeiten möchten, die möglicherweise vorhanden sind Sonderzeichen in ihnen. Daher ist es nicht erforderlich, geschweifte Klammern für Befehle anzugeben, die in ausgeführt werdenfind
.Es ist eine andere Geschichte, wenn Shell beteiligt wird. Manchmal müssen Sie eine Shell verwenden, um den Dateinamen zu verarbeiten. In diesem Fall ist das Zitieren zwar wichtig, aber es ist wichtig zu erkennen, dass es nicht das Problem von find ist - es ist die Shell, die die Wortteilung durchführt.
Wenn wir also innerhalb der Shell zitieren , wird es funktionieren. Aber auch das ist wichtig für Shell, nicht
find
.quelle
echo "I found {}"
besser alsecho "I found " {}
? Vielleicht ist es für Echo in Ordnung, aber wenn jemand den Befehl kopiert und das Echo durch einen anderen Befehl ersetzt, hat er möglicherweise ein Problem.