Siehe Beispiel unten:
$ ls -1p
appledir/
applefile
orangedir/
orangefile
$ find . -type f -name apple\*
./applefile
$ find . -type f -name orange\*
./orangefile
$ find . -type f -name apple\* -o -name orange\*
./applefile
./orangedir
./orangefile
$ find . -type f \( -name apple\* -o -name orange\* \)
./applefile
./orangefile
$
Ich war überrascht zu entdecken, dass ich die Klammern brauchte, damit dies wie erwartet funktionierte. anscheinend habe ich die Vorrangregel, nach der find
ihre Argumente bewertet werden, nicht verinnerlicht .
Wie kann ich leicht vorhersagen, wann und wann ich keine Klammern verwenden muss, um find
Primärfarben explizit zu gruppieren ?
Um es anders auszudrücken, was sind die Regeln , nach denen ich mir vorstellen kann find
Einsetzen Klammern in die Befehle , die ich geben, die mir erlauben, genau vorherzusagen , wie es ungruppierten Ausdrücke auswerten wird?
find
mit mehreren-name
und-exec
führt nur die letzten Spiele von-name
Antworten:
Gemäß der Dokumentation ,
Grundsätzlich können Sie sich also vorstellen
find
, zwei beliebige "anded" -Ausdrücke standardmäßig in Klammern zu setzen. Ihrewird interpretiert als
quelle
test
oderaction
Token unterscheidet? und prüft einfach, ob der Operand in einem Shell-Skript ausgewertet wirdtrue
oderfalse
auf die gleiche Weisetest
?find
diestest
und dieaction
Vorwahlen anders behandelt worden wären , so wie ein Compiler Variablentypen wie Array, Int und String unterschiedlich erkennen und behandeln würde. Aber Sie müssen wirklichfind
wie eine kleine Programmiersprache behandeln und die Operatoren und Operanden selbst verwalten, dankefind
Das Geschäft besteht darin, Ausdrücke auszuwerten - keine Dateien zu finden. Ja,find
zwar Dateien zu finden, aber das ist wirklich nur ein Nebeneffekt. Für mich war das Verständnis dieses Punktes der konzeptionelle Durchbruch, derfind
viel bewirkt hat nützlicher."