Forum: PC-Programmierung find utility


von daniel (Gast)


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?

von Peter (Gast)


Lesenswert?

was passiert bei

find ../mplab -iname "*.c" -or -iname "*.h" -echo {} . \;

von Peter (Gast)


Lesenswert?

oh steht ja schon mit echo da - vergiss es

von daniel (Gast)


Lesenswert?

BTW: does what i want
1
$ find ../mplab -iregex ".*[c|h]" -exec cp {} . \;

but still, what's wrong with the my first try?

von daniel (Gast)


Lesenswert?

hehe Peter du bist schnell :)

von Stephan M. (stephanm)


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

von Klaus W. (mfgkw)


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)

von Klaus W. (mfgkw)


Lesenswert?

ok, umsonst nachgedacht :-)

von Daniel -. (root)


Lesenswert?

Ich schreib jetzt von zu Hause.

Danke für Auflösung des Rätsels.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.