Einfache Konsolenfrage

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
wodga
Beiträge: 141
Registriert: 11.08.2003 13:14:45

Einfache Konsolenfrage

Beitrag von wodga » 05.12.2011 21:58:18

Ich möchte mittels des imagemagicktools convert alle Dateien eines Ordners umwandeln.

Also

Code: Alles auswählen

convert *.pdf  *.png
Dieser code erzeugt jedoch als Ziel hochgezählte Dateien also *-1.png *-2.png etc.

Ich hätte jedoch gerne, dass die *.png-Dateien bis auf die Endung den gleichen Namen haben wie die *.pdf-Dateien

Wie kann ich das bewerkstelligen?
siduction 2011.1 (debian unstable)

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

Re: Einfache Konsolenfrage

Beitrag von Meillo » 05.12.2011 22:18:25

wodga hat geschrieben:

Code: Alles auswählen

convert *.pdf  *.png
Dieser code erzeugt jedoch als Ziel hochgezählte Dateien also *-1.png *-2.png etc.
Sicher?

Braucht man dafuer nicht sowieso sowas:

Code: Alles auswählen

for i in *.pdf ; do
	convert "$i" "${i%pdf}png"
done
Denn `*.png' wird ja von der Shell expandiert.

Ich hätte jedoch gerne, dass die *.png-Dateien bis auf die Endung den gleichen Namen haben wie die *.pdf-Dateien
Die for-Schleife loest das Problem.
Use ed once in a while!

Benutzeravatar
wodga
Beiträge: 141
Registriert: 11.08.2003 13:14:45

Re: Einfache Konsolenfrage

Beitrag von wodga » 05.12.2011 22:22:16

Hab's mir selbst ergoogelt:

Code: Alles auswählen

ls -1 *.pdf | while read F; do convert $F `echo $F | sed -e "s/.pdf//"`.png; done
es funktioniert auch...leider aber hab ich's nicht vollständig kapiert. Kann mir das jemand in "Klarsprech" übersetzen?
siduction 2011.1 (debian unstable)

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Einfache Konsolenfrage

Beitrag von JaKlaRo » 05.12.2011 22:23:59

Hallo;
eine unflexible Lösung:

Code: Alles auswählen

for i in *pdf; do convert "$i" "${i%pdf}png"; done
Edit Meilo war schneller
eine flexible Lösung:

Code: Alles auswählen

#! /bin/bash
# picconvert

if [ $# -ne 2 ]; then
    echo "Falsche Eingabe!"
    echo "Beispielaufruf: picconvert jpg png"
fi

for i in *.$1; do
    if [ -f $i ]; then
        printf "\rKonvertiere: $i                           "
        convert "$i" "${i%$1}$2"
    else
        echo "Keine Datei mit der Endung $1 gefunden."
    fi
done
printf "\n"
exit
Gruß
JaKlaRo
HP Pavilion dv600: Debian Testing, Fluxbox, KDE

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

Re: Einfache Konsolenfrage

Beitrag von Meillo » 05.12.2011 22:50:51

wodga hat geschrieben:Hab's mir selbst ergoogelt:

Code: Alles auswählen

ls -1 *.pdf | while read F; do convert $F `echo $F | sed -e "s/.pdf//"`.png; done
es funktioniert auch...[...]
Funktioniert schon, ist aber herrlich kompliziert. Warum while-read wenn man auch for nehmen kann? Gut, ueber ${...%...} kann man diskutieren ... aber ihr verwendet ja doch alle die Bash und die kann das schon sehr lange (immer?) und in POSIX ist's auch drin.

Ich wuerde sagen, derjenige von dem du diese Loesung hast hat wenig Ahnung von Shellprogrammierung.

JaKlaRo hat geschrieben: eine unflexible Lösung:

Code: Alles auswählen

for i in *pdf; do convert "$i" "${i%pdf}png"; done
Warum unflexibel? Man kann die Zeile doch jedes Mal individuell anpassen wenn man sie in die Shell tippt. Gerade darum hat Unix ja eine programmierbare Shell. ;-)
Use ed once in a while!

Benutzeravatar
wodga
Beiträge: 141
Registriert: 11.08.2003 13:14:45

Re: Einfache Konsolenfrage

Beitrag von wodga » 05.12.2011 23:06:14

ich bin zugegebenermaßen ein blutiger Konsolenanfänger, ich kann nicht beurteilen wie kompliziert die Zeile ist.
Deswegen hätte ich auch gerne einen kurzen Erklärungskommentar zu den einzelnen Befehlen oder auf welcher Seite sollte ich mich für den Einstieg in die shell-Programmierung einlesen?
siduction 2011.1 (debian unstable)

DeletedUserReAsG

Re: Einfache Konsolenfrage

Beitrag von DeletedUserReAsG » 05.12.2011 23:36:29


Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Einfache Konsolenfrage

Beitrag von JaKlaRo » 05.12.2011 23:37:13

Meillo hat geschrieben: Warum unflexibel? Man kann die Zeile doch jedes Mal individuell anpassen wenn man sie in die Shell tippt. Gerade darum hat Unix ja eine programmierbare Shell. ;-)
... aber der Mensch - oder zumindest ich - ist faul und träge und schreibt sich einmal ein kleines Skript, um dann weniger Tipparbeit zu haben. :wink:

Gruß
JaKlaRo
HP Pavilion dv600: Debian Testing, Fluxbox, KDE

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

Re: Einfache Konsolenfrage

Beitrag von Meillo » 06.12.2011 12:42:56

JaKlaRo hat geschrieben:
Meillo hat geschrieben: Warum unflexibel? Man kann die Zeile doch jedes Mal individuell anpassen wenn man sie in die Shell tippt. Gerade darum hat Unix ja eine programmierbare Shell. ;-)
... aber der Mensch - oder zumindest ich - ist faul und träge und schreibt sich einmal ein kleines Skript, um dann weniger Tipparbeit zu haben. :wink:
Das kommt darauf an. Wenn du immer wieder genau die gleiche Konvertierung willst, dann lohnt sich ein Script. Wenn du aber convert immer wieder anders verwendest oder nicht alle Dateien konvertieren willst, dann kannst du die drei Zeilen auch gleich direkt tippen. Ein flexibles Script wird schnell sehr umfangreich und ist am Ende oft komplizierter zu bedienen als die drei Zeilen (mit voller Flexibilitaet) direkt einzutippen.

Die Frage ist: Wird der Fragende ueberhaupt andere Formate konvertieren wollen? Ist diese Flexibilitaet unnoetiger Overhead? Waere es vielleicht besser Flexibilitaet bei der Auswahl der zu konvertierenden Dateien zu haben? Was, wenn die Ergebnisdatei schon existiert? Was wenn die Dateien nicht im aktuellen Verzeichnis liegen.

All diese Fragen koennen jetzt unbeantwortet bleiben, wenn man es direkt auf der Shell macht. Andernfalls sollten sie besser jetzt schon beantwortet werden koennen.

Keine Frage: Kompliziertere Aufgaben sollten schon in Scripte gepackt werden; ebenso kleine Aufgaben, die feste Aufrufschemen haben (z.B. `tmux a || tmux' siehe hier). Im konkreten Fall finde ich ein Shellscript dafuer unnoetig kompliziert ... ausser der Fragende liefert ein festes Aufrufschema.
Use ed once in a while!

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

Re: Einfache Konsolenfrage

Beitrag von uname » 06.12.2011 13:55:24

Im Prinzip handelt es sich bei allen hier genannten Beispielen um die Zusammensetzung sehr einfacher Befehle, die nach etwas Übung so verständlich werden, dass man sie eigentlich gar nicht mehr scripten muss.

Beispiel z.B. mit Pipes (Ausgabe/Eingabe-Umleitung):

Code: Alles auswählen

cat datei |cut -d";" -f2 | sort | uniq -c
Sieht kompliziert aus. Ausgabe Datei, Auswahl zweite Spalte nach Semikolon, Sortierung und Zählung. Fertig.

Beispiel mit Oder ( || )

Code: Alles auswählen

tmux a || tmux
Es wird versucht eine Debiantmux-Sitzung zu attachen (Parameter a). "Oder" ist "wahr" wenn ein Wert wahr ist. Somit wird der zweite Teil (tmux ohne Parameter) nur erreicht wenn das Attachen fehlgeschlagen ist (sonst wäre die Aussage ja schon wahr). "tmux" ohne Parameter nutzt intuitiv "new", so dass eine neue tmux-Sitzung erzeugt wird. Als Resultat wird entweder eine existierende Sitzung übernommen oder eine neue Sitzung aufgebaut.

Die for-Scheife ist auch nicht wirklich kompliziert.

Code: Alles auswählen

for i in *pdf; do convert "$i" "${i%pdf}png"; done
Die Struktur muss man lernen, die Semikon sind sehr gewöhnungsbedürftig. Problematisch wäre noch wann z.B. Anführungszeichen z.B. bei Variablen sinnvoll sind. Auch dass i und $i im Prinzip identisch sind (einmal setzen, einmal nutzen) muss man erst mal verstehen. Das Entfernen von "pdf" und anhängen von "png" ist vielleicht auch nicht ganz selbsterklärend.

Benutzeravatar
wodga
Beiträge: 141
Registriert: 11.08.2003 13:14:45

Re: Einfache Konsolenfrage [Problem gelöst!]

Beitrag von wodga » 07.12.2011 08:43:22

danke für die ergiebigen Antworten, interessante Diskussion!
siduction 2011.1 (debian unstable)

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Einfache Konsolenfrage

Beitrag von Lohengrin » 07.12.2011 18:09:57

wodga hat geschrieben:Kann mir das jemand in "Klarsprech" übersetzen?
Ich kann, aber ich will nicht. Mach das selbst indem du dir die Hilfe zu den einzelnen Befehlem mit "help" oder "man" ansiehst.
Am Besten nimmst du dir ein paar Wochen lang jeden Tag eine Stunde Zeit und liest dir den Advanced Bash-Scripting Guide durch. Danach beantwortest du hier die Fragen.
Harry, hol schon mal das Rasiermesser!

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

Re: Einfache Konsolenfrage

Beitrag von uname » 08.12.2011 15:18:29

Kann mir das jemand in "Klarsprech" übersetzen?
Es ist auch hilfreich hier im Forum einfach mitzulesen und versuchen die angegebenen Probleme zu lösen oder wenn die Lösung vorliegt diese wirklich am System nachzuvollziehen.

Antworten