Operator-Vorrang in einem Suchbefehl?

9

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 findihre Argumente bewertet werden, nicht verinnerlicht .

Wie kann ich leicht vorhersagen, wann und wann ich keine Klammern verwenden muss, um findPrimä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?

Platzhalter
quelle
Danke, @ StéphaneChazelas; Das ist in der Tat eine viel umfassendere Diskussion und Antwort auf dieselbe Frage.
Wildcard

Antworten:

9

Gemäß der Dokumentation ,

Bitte beachten Sie, dass -abei impliziter Angabe (z. B. durch zwei Tests, die ohne expliziten Operator dazwischen angezeigt werden) oder explizit eine höhere Priorität als -o. Dies bedeutet, dass find . -name afile -o -name bfile -printniemals gedruckt wird afile.

Grundsätzlich können Sie sich also vorstellen find, zwei beliebige "anded" -Ausdrücke standardmäßig in Klammern zu setzen. Ihre

find . -type f -name apple\* -o -name orange\*

wird interpretiert als

find . \( -type f -name apple\* \) -o -name orange\*
Stephen Kitt
quelle
1
Bedeutet dies, dass find nicht zwischen testoder actionToken unterscheidet? und prüft einfach, ob der Operand in einem Shell-Skript ausgewertet wird trueoder falseauf die gleiche Weise test?
the_velour_fog
3
@the_velour_fog das stimmt; Tatsächlich geben Aktionen auch wahr oder falsch zurück, je nachdem, ob sie erfolgreich sind.
Stephen Kitt
Ah, das war es, was ich nur schwer verstehen konnte. Ich ging immer davon aus, dass finddies testund die actionVorwahlen 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 wirklich findwie eine kleine Programmiersprache behandeln und die Operatoren und Operanden selbst verwalten, danke
the_velour_fog
2
@the_velour_fog von Unix Power Tools, 3. Ausgabe : " findDas Geschäft besteht darin, Ausdrücke auszuwerten - keine Dateien zu finden. Ja, findzwar Dateien zu finden, aber das ist wirklich nur ein Nebeneffekt. Für mich war das Verständnis dieses Punktes der konzeptionelle Durchbruch, der findviel bewirkt hat nützlicher."
Wildcard
@ Wildcard, ja, es ist wichtig, dass es wirklich ein Evaluator für bedingte Ausdrücke ist. Gemäß Ihrer Frage - und meiner Herausforderung - war, wie die Regeln funktionieren. Der Vergleich des Befehls find mit einem Shell-bedingten Ausdruck (obwohl viel komplizierter als normal) war mein Durchbruch mit find. Es hat auch bei meiner allgemeinen Programmierung geholfen.
the_velour_fog