Chip88
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
Hey zusammen, ich würde gern ein klitzekleines ServiceMenü programmieren, mit dem ich jede beliebige Grafik zu PDF konvertieren & elegant umbenennen kann (ursprüngliche Dateiendung weg & durch pdf ersetzt). Ich habe das bisher immer mit ImageMagick über die Konsole gemacht:
convert input.BildFormatEndung output.pdf Mit Exec=convert %f %f.pdf $(echo %f | sed s/png/pdf/)
erreiche ich natürlich nur, dass die ursprüngliche Dateiendung nur bei PNGs durch PDF ersetzt wird. JPEGs, JPG oder andere Bilddateien bleiben hiervon ja leider unberührt. Wie müsste ich daher den Befehl umschreiben, damit das Konvertieren global für alle Bilddateien (also unabhängig ihres ursprünglichen Formats) klappt? Irgendwie steh ich grad extrem auf dem Schlauch... Vielen Dank im Voraus! Chipy
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
|
Chip88
(Themenstarter)
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
ChickenLipsRfun2eat schrieb: Versuchs mal mit
Danke für Deine Rückmeldung. Meinst Du so:
Exec=convert %f $(echo ${f%%.???}.pdf) Denn wenn ja, geht es leider nicht. ☹
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Dann wird vermutlich sh anstatt bash verwendet oder man darf das %f nicht als Shellvariable nutzen. Für sh ginge das so: | convert "%f" $(echo "${f%%.*}".pdf)
|
Ich würde dafür aber ein Script anlegen und dem Theater mit den Übergabevariablen ganz ausweichen. | #!/bin/sh
if [ "$#" -ne 1 ] || ! [ -f "$1" ]; then exit 1; fi
/usr/bin/convert "$1" "${1%%.*}".pdf
|
und unter /usr/local/bin/extension2pdf.sh abspeichern. (Damit es bei allen Nutzern abrufbar ist) Dann wäre die Exec-Zeile Exec=/usr/local/bin/extension2pdf.sh "%f"
|
Chip88
(Themenstarter)
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
ChickenLipsRfun2eat schrieb: Dann wird vermutlich sh anstatt bash verwendet oder man darf das %f nicht als Shellvariable nutzen. Für sh ginge das so: | convert "%f" $(echo "${f%%.*}".pdf)
|
Ich würde dafür aber ein Script anlegen und dem Theater mit den Übergabevariablen ganz ausweichen. | #!/bin/sh
if [ "$#" -ne 1 ] || ! [ -f "$1" ]; then exit 1; fi
/usr/bin/convert "$1" "${1%%.*}".pdf
|
und unter /usr/local/bin/extension2pdf.sh abspeichern. (Damit es bei allen Nutzern abrufbar ist) Dann wäre die Exec-Zeile Exec=/usr/local/bin/extension2pdf.sh "%f"
Danke für die beiden Codes. Aber irgendwie steckt heute der Wurm drin.
Keiner der beiden funktioniert leider. 😕 Hast Du noch eine Idee, woran das liegen könnte?
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Chip88 schrieb: Hast Du noch eine Idee, woran das liegen könnte?
Ja, weil ich im ersten Fall den Fehler gemacht habe f zu verwenden. Im zweiten weiß ich es nicht. Sagt dir ein journalctl -e etwas, direkt nach dem Versuch? Wie sieht deine .desktop-Datei aus?
|
Chip88
(Themenstarter)
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
ChickenLipsRfun2eat schrieb: Chip88 schrieb: Hast Du noch eine Idee, woran das liegen könnte?
Ja, weil ich im ersten Fall den Fehler gemacht habe f zu verwenden. Im zweiten weiß ich es nicht.
Was soll denn statt f verwendet werden?
Sagt dir ein journalctl -e etwas, direkt nach dem Versuch? Wie sieht deine .desktop-Datei aus?
Das ist die Ausgabe, wenn Exec=/usr/local/bin/extension2pdf.sh %f ausgeführt wird. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | Mai 09 20:17:56 chip org.kde.ActivityManager[1325]: Interval length is 0
Mai 09 20:17:56 chip org.kde.ActivityManager[1325]: New score : 12.4213
Mai 09 20:17:56 chip org.kde.ActivityManager[1325]: ResourceScoreUpdated: "9796df44-7c2e-439e-a03a-b8b525bab2ed" "org.kde.krunner" "applications:org.kde.konsole.desktop"
Mai 09 20:18:00 chip dbus-daemon[865]: [system] Activating service name='org.kde.ktexteditor.katetextbuffer' requested by ':1.77' (uid=1000 pid=2299 comm="/usr/bin/kate -b --tempfile " label="unconfined
Mai 09 20:18:00 chip org.kde.ktexteditor.katetextbuffer[9652]: QDBusArgument: read from a write-only object
Mai 09 20:18:00 chip org.kde.ktexteditor.katetextbuffer[9652]: QDBusArgument: read from a write-only object
Mai 09 20:18:00 chip org.kde.ktexteditor.katetextbuffer[9652]: QDBusArgument: read from a write-only object
Mai 09 20:18:00 chip dbus-daemon[865]: [system] Successfully activated service 'org.kde.ktexteditor.katetextbuffer'
Mai 09 20:18:03 chip polkit-agent-helper-1[9656]: pam_unix(polkit-1:auth): authentication failure; logname= uid=1000 euid=0 tty= ruser=mark rhost= user=mark
Mai 09 20:18:07 chip polkitd(authority=local)[924]: Operator of unix-session:1 successfully authenticated as unix-user:mark to gain TEMPORARY authorization for action org.kde.ktexteditor.katetextbuffer.
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: Creating the cache for: "applications:org.kde.dolphin.desktop"
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: Already in database? true
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: First update : QDateTime(2018-07-13 14:41:19.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: Last update : QDateTime(2021-05-09 19:46:17.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: After the adjustment
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: Current score : 54.9609
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: First update : QDateTime(2018-07-13 14:41:19.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: Last update : QDateTime(2021-05-09 19:46:17.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: Interval length is 0
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: New score : 55.9609
Mai 09 20:18:15 chip org.kde.ActivityManager[1325]: ResourceScoreUpdated: "9796df44-7c2e-439e-a03a-b8b525bab2ed" "org.kde.libtaskmanager" "applications:org.kde.dolphin.desktop"
|
Die .desktop - Datei ist an sich in Ordnung. Da sind auch andere Service Menüs drin. Danke für Deine Unterstützung!
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hast du nach dem einfügen des Scriptes kbuildsycoca5 ausgeführt? An sich sollte das funktionieren. Du müsstest aber noch das %f quoten, falls eine Datei mal Leerzeichen im Namen hat. Und: Das Ersetzen ist auch etwas mau. Funktioniert zwar, aber ist nicht zuverlässig (denke ich). Müsste das auch mal testen mit diversen Dateinamen, allerdings bin ich gerade ohne Plasma unterwegs 😉
|
Chip88
(Themenstarter)
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
ChickenLipsRfun2eat schrieb: Hast du nach dem einfügen des Scriptes kbuildsycoca5 ausgeführt?
Nein, habe ich nicht.
Hab das grad nachgeholt. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | kbuildsycoca5 running...
kf5.kservice.services: The desktop entry file "ServiceMenus/masterpdfeditor5.desktop" has Type= "Application" but is located under " "Gemeinsame Daten" " instead of "Applications"
kf5.kservice.sycoca: Invalid Service : "ServiceMenus/masterpdfeditor5.desktop"
"KConfigIni: In file /home/mark/.local/share/kservices5/ServiceMenus/mymenu_all.desktop, line 31: " "Invalid escape sequence \"\\ \"."
kf5.kservice.services: The desktop file "ServiceMenus/mymenu_pdf.desktop" references the action "pdf_resize_a5" but doesn't define it
kf5.kservice.services: The desktop file "ServiceMenus/mymenu_pdf.desktop" references the action "txtselectpages_layout" but doesn't define it
kf5.kservice.services: The desktop file "ServiceMenus/mymenu_pdf.desktop" references the action "metadata_update" but doesn't define it
kf5.kservice.services: The desktop file "ServiceMenus/mymenu_pdf.desktop" references the action "usb" but doesn't define it
kf5.kservice.services: The desktop file "ServiceMenus/mymenu_pdf.desktop" references the action "change_timestamp" but doesn't define it
kf5.kservice.services: The desktop file "ServiceMenus/mymenu_pdf.desktop" references the action "copy_path" but doesn't define it
kf5.kservice.sycoca: Parse error in "/home/mark/.config/menus/applications-merged/xdg-desktop-menu-dummy.menu" , line 1 , col 1 : "unexpected end of file"
kf5.kservice.services: The desktop entry file "/usr/share/applications/org.kde.drkonqi.desktop" has Type= "Application" but no Exec line
kf5.kservice.sycoca: Invalid Service : "/usr/share/applications/org.kde.drkonqi.desktop"
kf5.kservice.services: The desktop entry file "/usr/share/applications/org.kde.systemmonitor.desktop" has Type= "Application" but no Exec line
kf5.kservice.sycoca: Invalid Service : "/usr/share/applications/org.kde.systemmonitor.desktop"
|
An sich sollte das funktionieren. Du müsstest aber noch das %f quoten, falls eine Datei mal Leerzeichen im Namen hat. Und: Das Ersetzen ist auch etwas mau. Funktioniert zwar, aber ist nicht zuverlässig (denke ich). Müsste das auch mal testen mit diversen Dateinamen, allerdings bin ich gerade ohne Plasma unterwegs 😉
Hab es wieder gequotet:
Exec=/usr/local/bin/extension2pdf.sh "%f" Es geht aber trotzdem nicht... :/
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Na dann machen wir das mal so: Ändere das Script auf: | #!/bin/sh
if [ "$#" -ne 1 ] || ! [ -f "$1" ];then
/usr/bin/logger "$0: Fehler: Kein Argument übergeben oder Ziel ist keine Datei!"
exit 1
fi
/usr/bin/logger "$0: Convertiere $1"
/usr/bin/convert "$1" "${1%%.*}".pdf
|
Da sollte dann auf jeden Fall was im journalctl stehen.
|
Chip88
(Themenstarter)
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
ChickenLipsRfun2eat schrieb: Na dann machen wir das mal so: Ändere das Script auf: | #!/bin/sh
if [ "$#" -ne 1 ] || ! [ -f "$1" ];then
/usr/bin/logger "$0: Fehler: Kein Argument übergeben oder Ziel ist keine Datei!"
exit 1
fi
/usr/bin/logger "$0: Convertiere $1"
/usr/bin/convert "$1" "${1%%.*}".pdf
|
Da sollte dann auf jeden Fall was im journalctl stehen.
Alles klar! 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | Mai 09 20:59:42 chip dbus-daemon[865]: [system] Activating service name='org.kde.ktexteditor.katetextbuffer' requested by ':1.77' (uid=1000 pid=2299 comm="/usr/bin/kate -b --tempfile " label="unconfined
Mai 09 20:59:42 chip org.kde.ktexteditor.katetextbuffer[10242]: QDBusArgument: read from a write-only object
Mai 09 20:59:42 chip org.kde.ktexteditor.katetextbuffer[10242]: QDBusArgument: read from a write-only object
Mai 09 20:59:42 chip org.kde.ktexteditor.katetextbuffer[10242]: QDBusArgument: read from a write-only object
Mai 09 20:59:42 chip dbus-daemon[865]: [system] Successfully activated service 'org.kde.ktexteditor.katetextbuffer'
Mai 09 20:59:46 chip polkitd(authority=local)[924]: Operator of unix-session:1 successfully authenticated as unix-user:mark to gain TEMPORARY authorization for action org.kde.ktexteditor.katetextbuffer.
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: Creating the cache for: "applications:org.kde.konsole.desktop"
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: Already in database? true
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: First update : QDateTime(2018-05-20 21:48:31.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: Last update : QDateTime(2021-05-09 20:28:49.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: After the adjustment
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: Current score : 13.4213
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: First update : QDateTime(2018-05-20 21:48:31.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: Last update : QDateTime(2021-05-09 20:28:49.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: Interval length is 0
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: New score : 14.4213
Mai 09 20:59:56 chip org.kde.ActivityManager[1325]: ResourceScoreUpdated: "9796df44-7c2e-439e-a03a-b8b525bab2ed" "org.kde.krunner" "applications:org.kde.konsole.desktop"
Mai 09 21:00:00 chip dbus-daemon[865]: [system] Activating service name='org.kde.ktexteditor.katetextbuffer' requested by ':1.77' (uid=1000 pid=2299 comm="/usr/bin/kate -b --tempfile " label="unconfined
Mai 09 21:00:01 chip org.kde.ktexteditor.katetextbuffer[10273]: QDBusArgument: read from a write-only object
Mai 09 21:00:01 chip org.kde.ktexteditor.katetextbuffer[10273]: QDBusArgument: read from a write-only object
Mai 09 21:00:01 chip org.kde.ktexteditor.katetextbuffer[10273]: QDBusArgument: read from a write-only object
Mai 09 21:00:01 chip dbus-daemon[865]: [system] Successfully activated service 'org.kde.ktexteditor.katetextbuffer'
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: Creating the cache for: "applications:org.kde.dolphin.desktop"
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: Already in database? true
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: First update : QDateTime(2018-07-13 14:41:19.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: Last update : QDateTime(2021-05-09 20:27:55.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: After the adjustment
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: Current score : 56.9609
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: First update : QDateTime(2018-07-13 14:41:19.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: Last update : QDateTime(2021-05-09 20:27:55.000 CEST Qt::TimeSpec(LocalTime))
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: Interval length is 0
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: New score : 57.9609
Mai 09 21:00:12 chip org.kde.ActivityManager[1325]: ResourceScoreUpdated: "9796df44-7c2e-439e-a03a-b8b525bab2ed" "org.kde.libtaskmanager" "applications:org.kde.dolphin.desktop"
|
Jetzt bin ich gespannt...
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Ich würde fast sagen, das Script ist nicht ausführbar… | sudo chmod 555 /usr/local/bin/convert2pdf.sh
|
|
Chip88
(Themenstarter)
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
ChickenLipsRfun2eat schrieb: Ich würde fast sagen, das Script ist nicht ausführbar… | sudo chmod 555 /usr/local/bin/convert2pdf.sh
|
Mein Lieber, Du verdienst wieder Mal meine tiefste Anerkennung! Jepp, daran lag's!
Jetzt geht's endlich! Hab es mit jpg und png probiert und sogar mit Dateien, die Leerzeichen im Namen enthalten.
Geht alles wunderbar! Vielen, vielen Dank für Deine Unterstützung!!! EDIT: Der kürzere Code funktioniert ebenfalls einwandfrei!!!
| #!/bin/sh
if [ "$#" -ne 1 ] || ! [ -f "$1" ]; then exit 1; fi
/usr/bin/convert "$1" "${1%%.*}".pdf
|
Hab den langen auf den kurzen geändert, auch wenn das eigentlich sein dürfte, oder? EDIT 2: Die anderen Dateien unter /usr/local/bin/ sind übrigens allesamt bash. Worin macht sich der Unterschied zwischen bash und sh bemerkbar?!
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Chip88 schrieb: Der kürzere Code funktioniert ebenfalls einwandfrei!!!
Ja, den kannst du nehmen. Der längere sendet ja nur (unnötig) Infos ins journal. Falls es mal Probleme gibt, kann man das immer noch eintragen. Leerzeichen klappen dank quoting. Ich vermute aber mal, dass Dateien, die bild.1.2.3.png heißen dann zu bild.pdf werden. Ich weiß auch nicht, ob convert gnadenlos überschreibt oder Fehler meldet, falls es den Ziel-Dateinamen schon gibt. Da musst du ein wenig aufpassen. Oder wir bauen das Ding noch weiter aus.
Worin macht sich der Unterschied zwischen bash und sh bemerkbar?!
Gute Frage, aber die werde ich dir nicht beantworten. Das ist viel zu viel. Aber in Kürze: Beide haben unterschiedliche builtins, also Funktionen, die sie mitliefern, die bash bringt aber mehr mit, als sh. sh hält sich an POSIX, ist aber bei den meisten Systemen ein Link auf ash, csh, dash, die alle ihr eigenes Süppchen kochen. sh ist also der kleinste gemeinsame Funktionsbestand. Welche du verwendest, kannst du mit ls -lha /bin/sh herausfinden. Meistens ist es ein Link auf eine der genannten. Alpine nutzt ash, FreeBSD csh und Arch bash, bei Ubuntu ist es mMn dash. Dann gibt es noch ksh und diverse Korn-Shell-Ableger… Ich arbeite auch meistens mit der bash und vieles funktioniert auch, aber eben nicht alles. Nachtrag: Was noch wichtiger ist und ich dennoch gerade vergessen habe: Service-Programme wie systemd bspw. führen solche Scripte meistens mit reduzierten Umgebungsvariablen aus, weswegen dann auch nicht alles klappt. Daher gebe ich auch den vollständigen Pfad an. Wenn da bspw. nur convert steht, dieses aber in /usr/local/bin liegt und der Pfad (echo $PATH ) nicht /usr/local/bin enthält, dann wird das Tool nicht gefunden.
|
Chip88
(Themenstarter)
Anmeldungsdatum: 16. Juni 2008
Beiträge: 563
|
ChickenLipsRfun2eat schrieb: Chip88 schrieb: Der kürzere Code funktioniert ebenfalls einwandfrei!!!
Ja, den kannst du nehmen. Der längere sendet ja nur (unnötig) Infos ins journal. Falls es mal Probleme gibt, kann man das immer noch eintragen. Leerzeichen klappen dank quoting. Ich vermute aber mal, dass Dateien, die bild.1.2.3.png heißen dann zu bild.pdf werden. Ich weiß auch nicht, ob convert gnadenlos überschreibt oder Fehler meldet, falls es den Ziel-Dateinamen schon gibt. Da musst du ein wenig aufpassen. Oder wir bauen das Ding noch weiter aus.
Hab es grade aus Interesse ausprobiert & Du hast Natürlich erneut recht: a) Dateien, die bild.1.2.3.png heißen, werden zu bild.pdf. b) convert meldet keine Fehler & überschreibt gnadenlos, auch wenn es den Ziel - Dateinamen schon gibt. Oder wir bauen das Ding noch weiter aus.
Auf jeden Fall! Aber ich kann Dich beruhigen: Ich benenne Dateien grundsätzlich nieeeee mit einem Punkt.
Also auch ein Datum im klassischen Format mit Punkten in den Dateinamen zu schreiben, wäre mir viel zu gefährlich.
Nehme immer den Unterstrich _ , wenn ich sonst einen Punkt geschrieben hätte. Also eigentlich besteht keine akute Notwendigkeit, es weiter auszubauen, es sei denn, Du hast Lust, Dich mit mir daran auszutoben & auszuprobieren. 😎
Worin macht sich der Unterschied zwischen bash und sh bemerkbar?!
Gute Frage, aber die werde ich dir nicht beantworten. Das ist viel zu viel.
Das hab ich mir schon fast gedacht! ☺
Welche du verwendest, kannst du mit ls -lha /bin/sh herausfinden.
lrwxrwxrwx 1 root root 4 Mai 20 2018 /bin/sh -> dash Auch hier hattest Du recht:
Ubuntu nutzt dash. Wofür stehen in der Konsolenausgabe die beiden Daten (also 4. Mai 20 und 2018)?
Nachtrag: Was noch wichtiger ist und ich dennoch gerade vergessen habe: Service-Programme wie systemd bspw. führen solche Scripte meistens mit reduzierten Umgebungsvariablen aus, weswegen dann auch nicht alles klappt. Daher gebe ich auch den vollständigen Pfad an. Wenn da bspw. nur convert steht, dieses aber in /usr/local/bin liegt und der Pfad (echo $PATH ) nicht /usr/local/bin enthält, dann wird das Tool nicht gefunden.
Got it! =)
Macht ja auch Sinn... Vielen, vielen Dank nochmals für Deine Unterstützung & all Deine Erklärungen!!! Spitze!!! 👍 👍 👍
|