mikrocontroller.net

Forum: PC-Programmierung find utility


Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin gerade unter Cygwin und beobachte seltsames Verhalten von find.
@LTOPx /cygdrive/d/daniel/C
$ find ../mplab -iname "*.c" -or -iname "*.h"
../mplab/1/include/a.h
../mplab/1/include/b.h
../mplab/1/include/c.h
../mplab/1/src/main.c
../mplab/1/src/a.c
../mplab/1/src/b.c
$ find ../mplab -iname "*.c" -or -iname "*.h" -exec cp {} . \;

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

Woran liegt das?
Bug oder Misserwartung meinerseits?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was passiert bei

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh steht ja schon mit echo da - vergiss es

Autor: daniel (Gast)
Datum:

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

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

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hehe Peter du bist schnell :)

Autor: Stephan M. (stephanm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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
     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:
     find ../mplab -iname "*.c" -or "(" -iname "*.h" -a -exec echo {} . \; ")"

Lösung: Richtig klammern!
     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)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, umsonst nachgedacht :-)

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schreib jetzt von zu Hause.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.