find utility

Gast #1486265
Lesenswert?

Bin gerade unter Cygwin und beobachte seltsames Verhalten von find.
1
@LTOPx /cygdrive/d/daniel/C
2
$ find ../mplab -iname "*.c" -or -iname "*.h"
3
../mplab/1/include/a.h
4
../mplab/1/include/b.h
5
../mplab/1/include/c.h
6
../mplab/1/src/main.c
7
../mplab/1/src/a.c
8
../mplab/1/src/b.c
1
$ find ../mplab -iname "*.c" -or -iname "*.h" -exec cp {} . \;

kopiert mir aber nur *h Dateien
Ebenso ...
1
$ find ../mplab -iname "*.c" -or -iname "*.h" -exec echo {} . \;
2
../mplab/1/include/a.h
3
../mplab/1/include/b.h
4
../mplab/1/include/c.h

Woran liegt das?
Bug oder Misserwartung meinerseits?
#1486304
Lesenswert?

Hm ich hab mich auch erst gewundert... So funktionierts:

find ${DIR} \( -iname "*.cpp" -o -iname "*.h" \) -exec echo cp {} . \;

In der Manualpage von find steht folgendes:

EXPRESSIONS
The  expression  is  made  up of options (which affect overall operation
rather than the processing of a specific file, and always return true),
tests (which return a true or false value), and actions (which have side
effects and return a true  or false value), all separated by operators. 
-and is assumed where the operator is omitted.

Der letzte Satz ist der entscheidende.

Wenn man nun in den Abschnitt "OPERATORS" schaut, sieht man, das -a(nd) 
eine höhere Präzedenz hat als -o(r). Was Du gemacht hast ist also 
äquivalent zu

find ../mplab \( -iname "*.c" \) -or \( -iname "*.h" -exec cp {} \) . \;

Stephan
#1486307
Lesenswert?

Miss Erwartung in voller Schönheit.

Grund des Verhaltens:

1. Zwischen dem zweiten -iname und dem -exec steht kein Operator

2. Wegen des fehlenden Operators wird implizit ein AND angenommen
  (so also ob es
1
     find ../mplab -iname "*.c" -or -iname "*.h" -a -exec echo {} . \;
  hieße)

3. AND hat eine höhere Priorität als OR bei find

4. Dadurch entspricht das dem Ausdruck:
1
     find ../mplab -iname "*.c" -or "(" -iname "*.h" -a -exec echo {} . \; ")"

Lösung: Richtig klammern!
1
     find ../mplab "(" -iname "*.c" -or -iname "*.h" ")" -a -exec echo {} . \;
(wobei das -a jetzt auch wieder weg gelassen werden kann, weil es
ja implizit eingefügt werden würde)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren