Fried-rich
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Hallo, ich habe mir ein Service Menü erstellt um mit 'convert' (aus ImageMagick) alle Seiten eines PDF-Dokumentes zu extrahieren, jede Seite als einzelne Datei. Die Exec-Zeile sieht so aus: convert %f -compress lzw +adjoin %f.tiff Ich wollte nun das ganze in einen neuen Ordner schrieben lassen und habe diese Zeile versucht, die leider nicht geht: mkdir neu && cd neu && convert %f -compress lzw +adjoin %f.tiff Der Ordner wird erstellt, aber die Ausgabe erfolgt weiterhin in den gleichen Ordner in dem die Inputdatei liegt. Füge ich vor die Zeile das hier ein (um mal eine Meldung zum cd-Befehl zu erhalten) __konsole --hold -e__ mkdir neu && cd neu && convert %f -compress lzw +adjoin %f.tiff erhalte ich die Meldung, dass für das Anlegen des Ordners keine Berechtigung vorliegt. Wieso hat die letzte Zeile andere Rechte als die vorletzte? Lasse ich 'mkdir' und 'cd' weg und versuche nur den Convert-Befehl mit Konsolenausgabe anzeigen zu lassen bleibt das Konsolenfenster schwarz, aus Ausgabe erfolgt also. Wie kann ich mir anzeigen lassen was hier nicht geht? Oder hat jemand gleich eine Idee wieso hier nicht in den Ordner gewechselt wird. Convert bietet scheinbar keine eigene Lösung automatisch einen Unterordner zu erstellen. Friedrich
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Genaue Details kann ich dir mangels Erfahrung mit convert &Co leider nicht auf die Schnelle liefern. Generell ist es aber besser, man arbeitet bei solchen Dingen mit absoluten Pfaden, bzw. anstatt hineinzuwechseln, gibt man den neu erstellten an. Beispiel: | #anstatt
mkdir neu && cd neu && convert %f -compress lzw +adjoin %f.tiff
#versuche
mkdir neu && convert %f -compress lzw +adjoin neu/%f.tiff
|
Anstatt "neu" könntest du auch etwas dynamischeres nehmen, wie bspw. das Datum, da dir bei schon vorhandenem Verzeichnis "neu" im aktuellen Pfad nichts konvertiert wird. Das && bedeutet ja, dass es nur weitergeht, wenn der vorherige Befehl erfolgreich war (also true zurückliefert). Beispiel: | mkdir $(date +"%Y_%m_%d")neu
|
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Das geht wenn ich convert über die Konsole aufrufe, nicht aber aus dem Service Menü heraus. Da wird der Ordner erstellt und sonst nichts weiter. Die Ausgabe erfolgt weder in den Ordner noch in den Ordner mit der Inputdatei. Da es mit dem vorangesetzten 'konsole --hold -e' nicht geht weißich jetzt nicht wo der Fehler liegt.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
In welchem Ordner hast du denn die Service-Datei liegen? Lokal beim Benutzer? Kannst du die Desktop-Datei komplett posten? Davon abgesehen könntest du es mal mit %N versuchen, also den Pfad weglassen und nur den Dateinamen nutzen. Siehe KDE-Servicemenüs. Falls mehrere Befehle nicht klappen, ist es auch möglich ein Script als Exec anzugeben und dieses bspw. in ~/bin abzulegen. Ich vermute mal es liegt am %f, da dies nicht nur den Dateinamen, sondern auch den kompletten Pfad enthält und dann natürlich Murks entsteht, wenn man bspw. versucht die Datei nach /home/nutzer/neu/home/nutzer/dateiname zu speichern. Hab selbst keine ServiceMenus am laufen, da ich aliase bevorzuge und Yakuake nutze. Aber ich bastel mir mal eines und gucke mal, wie das in Plasma funktioniert.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Also: Datei /home/koffeinfriedhof/bin/serviceDatei.test
| #!/bin/bash
echo "*** $(date) ***" >> /home/koffeinfriedhof/test.log
echo ":Variable:$1::" >> /home/koffeinfriedhof/test.log
mkdir neu
cp "$1" neu/
|
Datei /home/koffeinfriedhof/.local/share/kservices5/ServiceMenus/test.desktop
| [Desktop Entry]
Type=Service
Actions=test;
X-KDE-ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
[Desktop Action test]
Name=Testkram
Icon=
Exec=/home/koffeinfriedhof/bin/serviceDatei.test %N
|
funktioniert. Es wird sowohl das Verzeichnis angelegt, als auch der Dateiname in die log geschrieben und die Datei kopiert. Jetzt bist du dran ☺
|
trollsportverein
Anmeldungsdatum: 21. Oktober 2010
Beiträge: 3422
|
Zufälligerweise hatte ich da schon vor einigen Jahren was gemacht, Unterschied ist, das Servicemenu macht zum Start ein Pop-up, dann aus PDF Dateien PNG Dateien und das pdf hinter dem Dateinamen macht es auch weg, wenn es fertig ist, macht es ein Pop-up:
[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=pdf_to_png;
X-KDE-Submenu= pdf convert ==>
X-KDE-Submenu[de]=pdf umwandeln ==>
Icon=kmplayer
[Desktop Action pdf_to_png]
Icon=okular
Name=pdf to png
Name[de]=pdf zu png
Exec=notify-send -i media-playback-start.png "pdf to png! :-)" ""%f" to png Running..." && convert -density 300x300 "%f" "`echo "%f" | sed s/.pdf/.png/`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "pdf to png: `echo "%f" | sed s/.pdf/.png/` Ready!"
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Ja, mit %N geht es. Deine Idee mit dem Datum im Ordnernamen ist auch gut. Er hat nur scheinbar ein Problem mit dem Leerzeichen zwischen 'date' und dem '+'. Ich hab versucht den ganzen Befehl in "" zu setzten, aber ohne Erfolg. Es wird kein Ordner erstellt. Exec=mkdir "$(date +"%Y_%m_%d")neu" && convert %N -compress lzw +adjoin "$(date +"%Y_%m_%d")neu"/%N.tiff
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Also mit angepasstem Script klappt es: #!/bin/bash
echo "*** $(date) ***" >> /home/koffeinfriedhof/test.log
echo ":Variable:$1::" >> /home/koffeinfriedhof/test.log
folder=$(date +"%Y_%m_%d")neu
mkdir $folder
cp "$1" "$folder/$1" Als Einzeiler hab ich es nicht versucht. Vermutlich müsste man da noch zusätzlich die bash aufrufen o.ä. Da bin ich aber nicht firm drin.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Klappt es denn nun bei dir, Fried-rich? Wenn ja, kannst du uns deine Einzeiler-Lösung zur Verfügung stellen?
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Ich bin hier noch am basteln da sich Ubuntu hier absolut unlogisch verhält. Wie oben geschrieben ging es mal %N in der *.desktop. Dann ging es plötzlich (mit der gleichen PDF) nicht mehr, dafür klappte wieder %F. Aktuell geht gar nichts mehr, ohne dass ich Änderungen am Script oder der *.desktop vorgenommen habe. Ich teste aus weiterhin die gleiche PDF. Meine zeitweise funktionierende Lösung sah so aus. Desktop-Datei: Exec=konsole -e /home/user/script %N Das Script: mkdir "$(date +"%Y.%m.%d_%H-%M-%S")"
convert "${1}" -compress none +adjoin "$(date +"%Y.%m.%d_%H-%M-%S")/${1}".tiff Aktuell legt er nicht einmal mehr den Ordner an. Auch nicht wenn ich statt dem aktuellen Datum/Uhrzeit einen x-beliebigen Namen verwende. Wenn hier ein Fehler drin ist frag ich mich wieso es eine Zeit lang funktionierte und wieso es mal mit &N und mal mit %F geht, obwohl ich nichts an den Dateien geändert habe. Gibt es irgendeine Möglichkeit mir anzeigen zu lassen was hier gemacht wird wenn ich ein ServiceMenü ausführe? Trotz 'konsole' in der Desktop-Datei bekomm ich nur ein schwarzes Fenster. Ich seh nicht wirklich was hier evtl. im Hintergrund falsch läuft. Man fischt hier gewaltig im trüben. edit (Mögliche Erklärung):
Gerade gesehen: Die Ordner wurde nicht in dem Verzeichnis erstellt in dem sich die PDF befindet, sondern (etwas willkürlich) unter /media/daten3 (einer Datenpartition). Die PDF liegt aber unter /media/daten1/PDF. Zu dem Zeitpunkt als ich das alles getestet habe lief ein Encoding von Videodateien die unter /media/daten3/serien lagen. Ich habe ein Script mit einem x264-Einzeiler über ein Terminal mit ./script gestartet. Ich vermute jetzt, dass er da das Script parallel ausgeführt wurde auch die Ordner dort erstellt hat (Warum aber nicht unter /media/daten3/serien??). Convert seinerseits hat aber einen anderen Ordner erwartet und schlug deshalb fehlt.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Du könntest die Befehlskette z.B. in einem tmux oder screen-Fenster ausführen lassen und da hineinwechseln, um Ausgaben zu sehen. Um herauszufinden, ob etwas überhaupt ausgeführt wird, benutze ich immer touch mit einer absoluten Pfadangabe. Also bspw /usr/bin/touch /home/BENUTZER/test.file Wird diese angelegt, funktioniert die Ausführung und es liegt am "Rest". Zwei Posts drüber hatte ich mir eine Logdatei mit den Infos geschrieben, das kann man auch machen, um bspw. die Variablenersetzung zu prüfen.
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Zwei Posts drüber hatte ich mir eine Logdatei mit den Infos geschrieben, das kann man auch machen, um bspw. die Variablenersetzung zu prüfen.
Hier muss ich zugeben, dass ich das Script nicht verstanden habe. Da wird doch nur die Ausgabe von 2 echo-Aufrufen geloggt. Du kopiert da auch scheinbar die ausgewählten Dateien in einen neuen Ordner bestehend aus dem aktuellen Datum?
Du könntest die Befehlskette z.B. in einem tmux oder screen-Fenster ausführen lassen und da hineinwechseln, um Ausgaben zu sehen.
Ich kenne nur Screen, das benutze ich auf meinem Downloadserver häufig. Aber um Screen zu starten muss ich doch eine Konsole starten und da dann Screen. Wie soll das hier helfen. Ich denke, wenn die Ausgabe über ein Terminal nicht geht, geht es auch über Screen nicht, oder?
Um herauszufinden, ob etwas überhaupt ausgeführt wird, benutze ich immer touch mit einer absoluten Pfadangabe. Also bspw /usr/bin/touch /home/BENUTZER/test.file Wird diese angelegt, funktioniert die Ausführung und es liegt am "Rest".
Auch hier kann ich dir nicht folgen was du meinst.
Jemand eine Idee wieso das ServiceMenü den Ordner in einem anderen Ort erstellt, wenn parallel ein zweites Terminalfenster offen ist? Hier scheint mit erstmal das Hauptproblem zu liegen.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Beispielscript mit Erklärung
| #!/bin/bash
echo "*** $(date) ***" >> /home/koffeinfriedhof/test.log #Hängt die Ausgabe des Date-Befehls an die test.log an
echo ":Variable:$1::" >> /home/koffeinfriedhof/test.log #Hängt die Ausgabe von $1 an die test.log an.
#solte die test.log noch nicht erstellt sein, wird diese automatisch angelegt
folder=$(date +"%Y_%m_%d")neu #Ordnername in der Form JAHR_MONAT_TAGneu generieren
mkdir $folder #Ordner mit o.g. Namen in aktuellem Pfad erstellen
cp "$1" "$folder/$1" #Kopieren der in $1 übergebenen Datei in den neuen Ordner der in $folder benannt wird
|
touch
Mit touch legt man leere Dateien an. Startest du dieses Anlegen über ein Script und die Datei wird erstellt, weißt du, dass das Script ausgelöst wird. Wird die Datei nicht erstellt, kann es an Fehlern mit den Rechten liegen oder das Ding wird eben nicht abgearbeitet. screen
Du kannst mit screen auch per Script eine neue Konsole anlegen, z.B. mit screen -L -dmS meinNeuesTerminal #-L ist für logging, kannste auch weglassen In diesem bestehenden Screen kannst du dann Befehle ausführen. Beispielsweise so: screen -r meinNeuesTerminal -p 0 -X eval 'stuff \015"cd Videos"\015'; Mit screen -r meinNeuesTerminal könntest du dir dann die Ausgaben ansehen. Für den Anfang solltest du auch Shell/Bash-Skripting-Guide für Anfänger abarbeiten.
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Für den Anfang solltest du auch Shell/Bash-Skripting-Guide für Anfänger abarbeiten.
Das hab ich mir mal angesehen, erklärt aber nicht, wieso der Skript in einem falschen Ordner die Bilder extrahiert wenn ein Terminalfenster nebenbei läuft. Evtl. könnte man sich das eben zurechtwursten indem man mit 'dirname' aus dem Input nur den Pfad extrahiert und in das Script einfügt, so dass der neue Ordner immer als Unterordner im Speicherort des PDF-Dokuments erstellt wird.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Dazu kann ich nichts sagen, da das bei mir nicht so ist. Ich habe in Yakuake immer einige Konsolenfenster offen, die in diversen Verzeichnissen - auch auf entfernten Rechnern - aktiv sind. Diese haben meinen Test nicht gestört. Möglicherweise fragst du Variablen ab, die mehrfach verändert werden?
|