YMMD!eggy hat geschrieben:16.09.2020 15:01:38@hikaru: Meillos Lösung ist schon deswegen viel guter weil da awk drin ist
... dann lehne ich mich mal zurueck.
YMMD!eggy hat geschrieben:16.09.2020 15:01:38@hikaru: Meillos Lösung ist schon deswegen viel guter weil da awk drin ist
Mir war von Anfang an klar, dass sowas kommt:eggy hat geschrieben:16.09.2020 15:01:38@hikaru: Meillos Lösung ist schon deswegen viel guter weil da awk drin ist . so.
hikaru hat geschrieben:10.08.2020 20:47:09Hier kommt bestimmt noch jemand mit einer eleganten awk-Lösung um die Ecke, die im Prinzip das Gleiche macht.
Verstehe! Dann ist awk sowas wie das Gegenstück zu Perl:eggy hat geschrieben:16.09.2020 15:01:38(egal ob es was tut, solange das nichtstun mit awk geschieht kann es garnicht falsch sein)
eggy hat geschrieben:16.09.2020 15:01:38...
Einfach fragen wenn was unklar ist, irgendwer (Meillo ) erklärts sicher gerne ausführlicher
...
Gut, dann mache ich hier schnell weiter bevor ihr unachtsam werdet:
Code: Alles auswählen
ls *.jpg | convert -rotate 180 *.jpg
Code: Alles auswählen
seite=1
for datei in `ls -1 ./IMG_*`
do
mv "$datei" "f-z-v-t_`printf '%03i' $seite`.jpg"
let seite+=2
done
Code: Alles auswählen
seite=1
for datei in `ls -1 ./IMG_*`
do
convert -rotate 180 "$datei"
mv "$datei" "f-z-v-t_`printf '%03i' $seite`.jpg"
let seite+=2
done
Code: Alles auswählen
mogrify -rotate 180 *.jpg
So arbeitet `convert' nicht, es braucht immer Input- und Output-File. Wenn du `convert' durch `mogrify' ersetzt, dann geht es. Einfacher waere aber:hikaru hat geschrieben:16.09.2020 16:01:04Code: Alles auswählen
seite=1 for datei in `ls -1 ./IMG_*` do convert -rotate 180 "$datei" mv "$datei" "f-z-v-t_`printf '%03i' $seite`.jpg" let seite+=2 done
Code: Alles auswählen
for datei in `ls -1 ./IMG_*`
do
convert -rotate 180 "$datei" "f-z-v-t_`printf '%03i' $seite`.jpg"
let seite+=2
done
Das tut es perfekt. Danke.Meillo hat geschrieben:16.09.2020 16:06:12`convert' erzeugt eine neue Datei mit dem Bearbeitungsergebnis. In-place-Aenderungen macht man mit `mogrify'. Die beiden Befehle koennen das Gleiche nur arbeitet zweiteres eben in-place. Da geht dann sowas wie:
Code: Alles auswählen
mogrify -rotate 180 *.jpg
(Auf die anderen Seitenaeste des Themas kann ich gerade zeitlich nicht eingehen, aber in der Sache wollte ich euch nicht in der Luft haengen lassen.)
@Meillo: fastMeillo hat geschrieben:16.09.2020 16:06:12Die beiden Befehle koennen das Gleiche nur arbeitet zweiteres eben in-place.
Code: Alles auswählen
diff convert.c mogrify.c |wc
8073 22177 298058
DONE!seite=2;for datei in `ls -r -1 ./IMG_*`;do mv "$datei" "titel_`printf '%03i' $seite`.jpg";let seite+=2;done
Die Option `--help' ist allerdings auch nur ein undokumentiertes Gimmick. Bei Imagemagick haben alle Optionen nur ein Minuszeichen, also `-help' und `-version', die beide in der Manpage stehen und bei beiden Programmen funktionieren.eggy hat geschrieben:16.09.2020 16:47:47@Meillo: fastMeillo hat geschrieben:16.09.2020 16:06:12Die beiden Befehle koennen das Gleiche nur arbeitet zweiteres eben in-place.mogrify kennt z.B. kein --helpCode: Alles auswählen
diff convert.c mogrify.c |wc 8073 22177 298058
</klugscheissmodus>
Mit `mogrify' kann man das Dateiformat nicht aendern, mit `convert' schon. Das ist wohl der wichtigste Fall. Darueber hinaus kann man bei `convert' getrennte Input- und Output-Optionen haben, z.B. `-density', das IIRC dafuer verwendet werden kann, eine Input-Vektor-Datei gewuenscht genau zu rastern, was dann aber unabhaengig davon ist, wie die Ausgabe-Datei gerastert ist. (Ich meine mich zu erinnern, dass ich das verwendet habe, um PDFs ins PNGs zu konvertieren. Die waren immer zu verpixelt. Die Output-Aufloesung hochzufahren hat nichts gebracht, aber die Input-Density anzupassen schon. So oder so aehnlich war das.) All dies kann `mogrify' nicht. Insgesamt ist `convert' maechtiger, aber `mogrify' ist bequemer wenn man viele Dateien in-place einfach bearbeiten will.Aber ja, in den meisten Fällen kanns das gleiche, nen paar Optionen machen inplace vermutlich keinen Sinn, und wenn ich es richtig in Erinnerung hab, gab es minimale Unterschiede in irgendwelchen super speziellen Sonderfällen, wo man das eine und nicht das andere nehmen musste, aber frag nicht was das war, ist schon ewig her
Ich versuche, euch das naechste Mal mehr Zeit zu geben.Und keine Sorge, wir hätten das auch gewusst - Du warst nur mal wieder schneller
Befehle koennen zwei Arten von Input nutzen:michaa7 hat geschrieben:16.09.2020 15:44:41Und lerneifrig wie ich bin habe ich mir zusammengeschustert:
Code: Alles auswählen
ls *.jpg | convert -rotate 180 *.jpg
Code: Alles auswählen
:-Q wc *
827 3344 136119 a
603 2763 70941 b
881 5830 303794 c
8282 36429 1845521 d
10593 48366 2356375 total
:-Q cat *|wc
10593 48364 2356375
Der Meinung bin ich auch.hikaru hat geschrieben:16.09.2020 10:44:34... das hier aber nicht. Und ich glaube nicht, dass das an meinen mangelnden awk-Kenntnissen liegt.Meillo hat geschrieben:16.09.2020 07:59:57- Mein Befehl ist besser lesbar (awk-Kenntnisse vorausgesetzt), weil er kuerzer ist und weniger Noise enthaelt. Er besteht nur aus den relevanten Komponenten: die relevanten Dateien, printf, Formatstring fuer den mv-Befehl, bisheriger Dateiname, Nummer des neuen Dateinamens (genau so notiert wie michaa7 das im Threadtitel gemacht hat), sh zur Durchfuehrung. Alles in der Reihenfolge, man muss beim Lesen nicht vor und zurueck springen. (Schwierig sind lediglich `$1' (was `$0' heissen sollte) und `NR' in awk, fuer awk-Programmierer gehoeren die aber zum Standard-Repertoire.)
Im Detail:
1. Kürze um der Kürze willen sehe ich nicht als Zeichen für Codequalität.
Leider ist die Frage von Signal und Noise stark vorwissen- und gewohnheitsabhaengig. Ist also `seite = seite + 2' mehr Noise als `seite += 2'? Das zweite Statement sagt kompakter das gleiche aus, also hat es, bei gleichem Signal, weniger Noise. Die Rechnung funktioniert aber nur wenn dem Codeleser beides gleichermassen bekannt und verstaendlich ist.2. Wenn du sagst, dass dein Befehl weniger Noise enthält, dann müsstest du den Noise in heinz' Befehl ("irrelevante Komponenten"?) benennen können. Ich sehe keinen.
Akzeptiert.3. Dass man bei deiner Lösung beim Lesen nicht vor und zurückspringen mus stimmt nicht, denn man muss zumindest die Einsetzungen bei printf machen.
Was du hier schreibst entspricht dem was ich oben schreibe -- es ist vorwissen- und gewohnheitsabhaengig. Da jeder anderes Vorwissen hat und Unterschiedliches gewohnt ist, kommt man zu unterschiedlichen Ergebnissen.4. $1/$0 und NR: Mag sein, dass das Standardrepertoire von awk ist. Zumindest Ersteres ist auch ohne awk-Kenntnisse Programmierer-Allgemeinwissen. Aber für NR braucht man dann wirklich spezifische Kenntnisse. Das Äquivalent dazu in heinz' Lösung ist das "let". Mag sein, dass das mein Bias ist, aber ich finde das zumindest nicht fordernder als awks NR. Die Funktion von beiden erschließt sich für Unwissende aus dem Aufgabenkontext.
michaa7 hat geschrieben:16.09.2020 17:49:36Habe eben die gradzahligen Seiten abfotografiert. Ging mit Seite 2 los, den Umschlag hatte ich schon gestern per Hand angepasst. Kleiner Stolperstein: Heute von hinten fotografiert, war umblättertechnisch am einfachsten. Schlau wie ich dank euch nun bin führte das zu folgender Befehlszeile:
seite=2;for datei in `ls -r -1 ./IMG_*`;do mv "$datei" "titel_`printf '%03i' $seite`.jpg";let seite+=2;done
Danke!Meillo hat geschrieben:16.09.2020 16:09:28So arbeitet `convert' nicht, es braucht immer Input- und Output-File. Wenn du `convert' durch `mogrify' ersetzt, dann geht es.
Meillo hat geschrieben:16.09.2020 16:09:28Ach, man sollte nicht mal schnell noch posten wollen, wenn man eigentlich keine Zeit hat.
Ich glaube, wir haben hier unterschiedliche Definitionen von "Noise". Für mich ist dein Beispiel kein Noise, denn es wird ja dabei nichts Unnötiges gemacht. Es wird lediglich die Notation länger, was ich nicht als Nachteil sehe.Meillo hat geschrieben:16.09.2020 23:01:08Leider ist die Frage von Signal und Noise stark vorwissen- und gewohnheitsabhaengig. Ist also `seite = seite + 2' mehr Noise als `seite += 2'? Das zweite Statement sagt kompakter das gleiche aus, also hat es, bei gleichem Signal, weniger Noise. Die Rechnung funktioniert aber nur wenn dem Codeleser beides gleichermassen bekannt und verstaendlich ist.
Hier gehe ich mit. Um es mal mit einem IT-fremden Vergleich zu verdeutlichen:Meillo hat geschrieben:16.09.2020 16:09:28Noise kann man reduzieren, wenn man mehr implizite Funktionen der Programmiersprache nutzt, statt die Dinge von Hand zu machen. Darum hat C beispielsweise recht viel Noise. Statt `"foo" + "bar"' muss man dort snprintf(3) und was weiss ich verwenden, Memorymanagement machen, usw. Beides hat die gleiche Aussagekraft, aber im ersten Fall macht die Programmiersprache das Memorymanagement implizit fuer einen. Darum hat der Programmierer weniger Noise in seiner Wahrnehmung.
Dieses Verlagern in implizite Funktionen geht aber nur mit awk-spezifischem Spezialwissen und gehört in meinen Augen nicht zum Thema "Bilder umbenennen". Daher sollte das auch kein Kriterium zur Bewertung des eigentlichen Themas sein, sondern nur in die B-Note für die Beherrschung des gewählten Lösungswegs eingehen.Meillo hat geschrieben:16.09.2020 16:09:28Ebenso nun hier. In awk spart man sich das Verwalten der Seitennummer, sie muss nicht initialisiert und nicht inkrementiert werden. Stattdessen nutzt man den implizit gefuehrten (vereinfacht gesagt) Zeilenzaehler `NR' (= Number of Record) und wendet darauf eine Funktion (NR*2-1) an. Wie im obigen Beispiel enthaelt der Code auch weniger Noise, weil mehr Logik in den impliziten Bereich verlagert worden ist.
Ich mache das nicht freiwillig. Ich bin nicht mal ein guter Programmierer. Im Grunde bin ich eher ein Exemplar für das Sprichwort: "Beware of programmers carrying screwdrivers!"Meillo hat geschrieben:16.09.2020 16:09:28Im Uebrigen ist es lustig, dass du Perl programmierst, denn da ist ja die Koenigssprache der impliziten Allmaechtigkeit.