[gelöst] find -exec nimmt nur subset von funden in boolschem ausdruck

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2529
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

[gelöst] find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von reox » 17.11.2022 13:48:16

Ich wundere mich gerade über das Verhalten von find:

Code: Alles auswählen

find . -iname \*.jpg -o -iname \*.jpeg
findet im aktuellen verzeichnis alle dateien die jpg oder jpeg heißen, case-insensitive. Funktioniert so weit problemlos - alle .jpeg und .jpg files werden angezeigt.
Nun verknüpft mit -exec:

Code: Alles auswählen

find . -iname \*.jpg -o -iname \*.jpeg -exec jpeginfo -c {} +
jpeginfo bearbeitet nur noch die dateien die jpeg heißen (schreibt man jpg als zweites sind es nur diese)

Klammern setzen hilft:

Code: Alles auswählen

find . \( -iname \*.jpg -o -iname \*.jpeg \) -exec jpeginfo -c {} +
Aber warum ist das so?! Ich dachte -exec nimmt alle funde und führt den Befehl aus und nachdem es ohne -exec auch alle dateien sind, wieso ist es dann mit -exec nicht so?
Ist das ein Feature was ich in der manpage übersehen habe?

Hier rennt ein

Code: Alles auswählen

find (GNU findutils) 4.8.0
Zuletzt geändert von reox am 17.11.2022 14:25:03, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von heisenberg » 17.11.2022 13:56:08

Ich würde sagen, jedes Element wird mit jedem anderen logisch verknüpft. Vorgabe ist : and. Außerdem bindet and stärker als or. Das erklärt das Verhalten.

Ob das tatsächlich in der Doku so steht und wo, kann ich Dir nicht sagen.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von MSfree » 17.11.2022 13:57:26

reox hat geschrieben: ↑ zum Beitrag ↑
17.11.2022 13:48:16
Aber warum ist das so?
Das "Warum" kann ich dir nicht beantworten. Tatsache ist aber, daß ich über so ein ähnliches Problem bereits ca. 1990 auf Unixsystemen gestolpert bin. :mrgreen:

Das war also praktisch schon immer so.

reox
Beiträge: 2529
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von reox » 17.11.2022 14:01:00

MSfree hat geschrieben: ↑ zum Beitrag ↑
17.11.2022 13:57:26
Das war also praktisch schon immer so.
Mhh ich komm erst 30 jahre später drauf :D
heisenberg hat geschrieben: ↑ zum Beitrag ↑
17.11.2022 13:56:08
Ich würde sagen, jedes Element wird mit jedem anderen logisch verknüpft. Vorgabe ist : and. Außerdem bindet and stärker als or. Das erklärt das Verhalten.
Das klingt logisch und ich hab zumindest herausgefunden, dass find mehrere -exec unterstüzt und man kann tatsächlich sowas machen:

Code: Alles auswählen

find . -iname \*.jpg -exec other_command {} + -o -iname \*.jpeg -exec jpeginfo -c {} +

EDIT: ich glaub ich weiß wieso das so ist. -exec wird offenbar wie eine ganz normale expression behandelt nur schaltet es gleichzeitig die ausgabe der funde aus. Man kann nämlich auch -exec als weiteren test verwenden, ob files eingeschlossen werden sollen oder nicht:

Code: Alles auswählen

find . \( \( -iname \*.jpg -exec false \; \) -o \( -iname \*.jpeg -exec true \; \) \) -print
dH eigentlich verwende ich es falsch. Besser wäre wohl mit -print0 und xargs -0 zu arbeiten... Damit stellt man sicher das alle funde an das Program übergeben werden, ohne das zB ein Fehler des Programs find abbrechen lässt. Die Fehlerbehandlung schiebt man dann einfach weiter, was zB in meinem Fall Sinn macht (aber nicht immer so sein muss)

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von heisenberg » 17.11.2022 14:16:56

-print ist auch eine exec-expression, die gesetzt ist, wenn keine andere exec-expression gesetzt ist.

Ist mal wieder Zeit, sich gemütlich mit der find-manpage an den Kamin zu setzen und den ein oder anderen gemütlichen Abend zu verbringen...

Ich lese gerade, dass das Verhalten sehr gut in der man-page beschrieben ist.

reox
Beiträge: 2529
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von reox » 17.11.2022 14:24:51

In der tat...

Aber ja, jetzt seh ich auch wo genau das in der manpage beschrieben steht, nämlich direkt bei expressions https://manpages.debian.org/bullseye/fi ... EXPRESSION:
man find hat geschrieben: Actions
Actions have side effects (such as printing something on the standard output) and return either true or false, usually based on whether or not they are successful. The -print action for example prints the name of the current file on the standard output.
Ok - die Antwort auf die Frage ist also "your assumptions were wrong". Ich dachte immer -exec ist sowas wie "nimm alle finds und schmeiß da rein" aber in wirklichkeit ist es ein weiterer test den man ausführen kann und/oder zur weiterverarbeitung der dateien verwenden.

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: [gelöst] find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von uname » 17.11.2022 15:21:52

Die Frage ist zwar beantwortet aber ich hätte dann doch noch eine Zusatzfrage.
Irgendwann wurde aus auch schon mal besprochen. Leider habe ich es vergessen wie so vieles.

Anstatt von -exec kann man ja auch z. B. | xargs verwenden.
Wäre das hier anstatt der Klammern vielleicht sinnvoll gewesen?
Ab wann macht Pipe und xargs z. B. von der Menge und/oder Performance keinen Sinn mehr?
Gibt es dafür Erfahrungswerte oder ist | xargs generell eine schlechte Idee?

reox
Beiträge: 2529
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] find -exec nimmt nur subset von funden in boolschem ausdruck

Beitrag von reox » 17.11.2022 15:27:39

uname hat geschrieben: ↑ zum Beitrag ↑
17.11.2022 15:21:52
Wäre das hier anstatt der Klammern vielleicht sinnvoll gewesen?
Naja, die Klammern kann man sich nicht sparen, da -print0 genau wie -exec funktionert :D

Aber xargs hat eine option -P mit der man ggf alles noch schneller bekommt - falls man parallele verarbeitung braucht.

Antworten