find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von dakuan » 01.12.2021 19:11:24

Ich kämpfe mal wieder mit dem Programm find.

Ich will in einem Dateibaum in mehreren Bilddateien mit unterschiedlichen Dateiendungen die Kommentare bearbeiten lassen. Die Bearbeitung geschieht in einem gesonderten Programm. Zur Suche habe ich folgendes Script vorgeschaltet:

Code: Alles auswählen

#!/bin/bash
#
verbose="-v"
simulation="-n"

echo "Convert normal date strings into ISO format"
echo
read -n1 -p"Only simulate conversion? (y/n)" input
case $input in
    y|j ) simulation="-n" ;;
    n )   simulation="" ;;
    * )   echo
          echo "by"
          exit 0;;
esac
#find . -depth -name "*-.jpg" -or "*-.png" -or "*.gif" | while read i;
find . -depth -name "*-.jpg" | while read i;
do
    comed ${verbose} ${simulation} "$i";
done
read -n1 -p"close"
Im Prinzip funktioniert das auch, allerdings immer nur mit einer Dateiendung. Wenn ich versuche mehrere anzugeben, bekomme ich die folgende Fehlermeldung:
find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden
Bei einigen Versuchen kam die Fehlermeldung auch gleich mit jpg. Ich habe natürlich auch andere Kombinationen versucht, aber es wird dann jedes mal schlimmer. Suchergebnisse im Internet beziehen sich immer nur auf ein einfaches Suchmuster und bringen mich auch nicht weiter.

Was mache ich da falsch, oder geht das gar nicht?
Zuletzt geändert von dakuan am 01.12.2021 19:28:52, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden

Beitrag von Meillo » 01.12.2021 19:14:00

[Und nun schon der dritte Edit. Merke: besser erst genau lesen und denken. :roll: ]

Jedes Dateinamenspattern braucht ein `-name' davor.
Use ed once in a while!

dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden

Beitrag von dakuan » 01.12.2021 19:28:02

Danke! Jetzt funktioniert es.

Aber da wäre ich im Leben nicht drauf gekommen.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von tobo » 01.12.2021 19:49:41

Eine Version ohne diese hässliche Schleife und mit POSIX-Oder:

Code: Alles auswählen

find . -depth -name "*.jpg" -o -name "*.png" -o -name "*.gif" -exec comed "$verbose" "$simulation" {} \;
Ich kann comed nicht beurteilen - vielleicht am Ende "+" anstatt "\;" verwenden. Bei vielen Einträgen macht das zeitlich schon was aus.

dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von dakuan » 01.12.2021 20:23:14

Ich habe das "{} \;" schon öfters gesehen. Aber als hobbymäßiger C-Programmierer ist mir nicht klar, was das bewirkt.
Ich kann comed nicht beurteilen ...
Das ist ein einfaches Konsolenprogramm (von comment edit). Es bekommt einen Dateinamen, schaut ob da ein Kommentar drinn ist und sucht dort nach einem Datum im US Format, So ähnlich wie strptime(), aber ohne Lokalisierung und mit mehr Fehlertoleranz.

Im schlimmsten Fall müssen ca. 20.000 Dateien aus einem Pool von 450000 herausgesucht werden. Wirklich bearbeitet werden müssen aber schätzungsweise nur ca. 800.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von tobo » 01.12.2021 20:47:35

{} ist die Platzierung des Suchergebnisses, also die Bilddateien, die gefunden werden im angegebenen exec-Kontext. + bzw. \; ist die Übergabe dieses Ergebnisses.

Mit \; wird jede Bilddatei einzeln übergeben, also zb:
comed "$verbose" "$simulation" bild1.jpg
comed "$verbose" "$simulation" bild2.png
comed "$verbose" "$simulation" bild3.gif
...

Mit + werden die Bilddateien zusammen übergeben. Z.B. so:
comed "$verbose" "$simulation" bild1.jpg bild2.png bild3.gif ...

Wenn also comed in der Lage ist mehrere Argumente aufzunehmen, dann wäre das abschließende +, bezüglich der Verarbeitungsgeschwindigkeit, eindeutig vorzuziehen, da weniger Prozesse nötig sind.

dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von dakuan » 01.12.2021 22:07:13

Ok, was da passieren soll, habe ich jetzt verstanden. Aber die Umsetzung, so wie vorgeschlagen, funktioniert nicht. Es wird immer nur genau eine Datei abgearbeitet. Und bei der "+" Variante beschwert sich mein Programm, das kein Dateiname übergeben wurde, was mich etwas überrascht. Wenn die als Parameter übergeben werden sollte doch wenigstens ein Name abgearbeitet werden. Oder wird da eine Pipe benutzt? Das könnte ich relativ einfach einbauen.

Irgend etwas fehlt mir da noch. Aber heute mache ich da keine Experimente mehr. Ich schaue mir lieber Snooker im TV an und mache morgen weiter (hoffentlich ausgeschlafen ;-) ).

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von tobo » 01.12.2021 22:21:29

Sorry, das war mein Fehler! Mittels -o wird die interne Parameterliste praktisch am ODER geteilt. Richtig (geklammert) muss es so aussehen:

Code: Alles auswählen

find . -depth \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \) -exec comed "$verbose" "$simulation" {} \;
bzw.
find . -depth \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \) -exec comed "$verbose" "$simulation" {} +

dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von dakuan » 01.12.2021 22:52:33

Danke, ich denke das ist es gewesen!

Das Script hat gerade 104 Dateien aus 20 Unterverzeichnissen mit jeweils ca 400 Dateien erfolgreich abgearbeitet.

Wie viel das jetzt schneller war, kann ich nicht sagen (keine Messung) weil ich mir die kompletten Kommentare - vorher / nachher - anzeigen lasse, aber das sieht schon recht flott aus.

P.s.; Auch wenn das bisher nicht so deutlich geworden ist, die Dateien "of interest" haben immer ein "-" vor dem Punkt. Andernfalls würde die Verarbeitungszeit deutlich größer sein. Wenn ich wirklich in alle ca. 450000 Dateien reinschauen will, steigt mein Stromverbrauch signifikant an :-)

Ps2: woher weiß man so etwas mit der Klammer? Das habe ich bisher noch nirgendwo gesehen.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von tobo » 01.12.2021 23:20:30

dakuan hat geschrieben: ↑ zum Beitrag ↑
01.12.2021 22:52:33
P.s.; Auch wenn das bisher nicht so deutlich geworden ist, die Dateien "of interest" haben immer ein "-" vor dem Punkt. Andernfalls würde die Verarbeitungszeit deutlich größer sein. Wenn ich wirklich in alle ca. 450000 Dateien reinschauen will, steigt mein Stromverbrauch signifikant an :-)
Dann müssen die "-" wieder hin, da ich das nicht direkt als Ausschlusskriterium (für die anderen Dateien) angenommen habe.
Ps2: woher weiß man so etwas mit der Klammer? Das habe ich bisher noch nirgendwo gesehen.
Im Zweifel, weil man das auch schon mal so hier hatte:
viewtopic.php?p=954963&hilit=find+oder#p954963
Schützt, wie man sieht, aber trotzdem nicht vorm vergessen...
Zuletzt geändert von tobo am 02.12.2021 10:02:00, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von Meillo » 02.12.2021 05:50:20

dakuan hat geschrieben: ↑ zum Beitrag ↑
01.12.2021 22:52:33
Ps2: woher weiß man so etwas mit der Klammer? Das habe ich bisher noch nirgendwo gesehen.
Siehe Manpage. ;-) Manchmal ist es kein Fehler, diese auch mal wirklich zu lesen. :-P

Gleich zu Beginn:
DESCRIPTION
This manual page documents the GNU version of find. GNU
find searches the directory tree rooted at each given
file name by evaluating the given expression from left to
right, according to the rules of precedence (see section
OPERATORS), until the outcome is known [...]
Und dann Abschnitt OPERATORS:
OPERATORS
Listed in order of decreasing precedence:

( expr )
Force precedence. Since parentheses are special
to the shell, you will normally need to quote
them. Many of the examples in this manual page
use backslashes for this purpose: `\(...\)'
instead of `(...)'.
[...]
Use ed once in a while!

dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von dakuan » 02.12.2021 19:36:15

Den alten Thread hatte ich nicht gefunden, weil ich den Anfang der Fehlermeldung als Suchbegriff hatte. Mit fiel nichte bessere ein.

Und natürlich hatte ich auch in der Manpage gesucht. Allerdings ist mein Englisch nicht so dolle. Da kriege ich die Feinheiten nicht immer mit, leider.
Und das mit (expr) ist mir komplett entgangen. Aber jetzt weiß ich ja, wonach ich nächstes Mal suchen muss.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von tobo » 02.12.2021 20:51:15

dakuan hat geschrieben: ↑ zum Beitrag ↑
02.12.2021 19:36:15
Und natürlich hatte ich auch in der Manpage gesucht. Allerdings ist mein Englisch nicht so dolle. Da kriege ich die Feinheiten nicht immer mit, leider.
Also, die manpages sind eigentlich die wichtigste Informationsquelle überhaupt. Wenn du weder durch "man find" noch durch "man -Lde find" eine deutsche Handbuchseite zu find siehst, dann solltest du vielleicht die Pakete manpages-de und manpages-de-dev nachinstallieren.

dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

Re: find: Pfade müssen dem Ausdruck `*-.png' vorangestellt werden [gelöst]

Beitrag von dakuan » 03.12.2021 21:00:44

Mir war bisher nicht bekannt, dass es auch deutsche Manpages gibt. Allerdings hatte ich auch nicht danach gesucht.

Meine bisherige Erfahrung mit deutschen Übersetzungen war nicht sehr gut. Bei vielen Suchbegriffen habe ich den Eindruck, das Suchmaschinen die englischen Fundstellen per Programm übersetzen. Das ist dann sehr holperig und sinnentstellend.

Ich schau mal, ob ich mit manpages-de besser zurecht komme, und wenn es nur als Ergänzung ist.

Antworten