Siduction Forum
Siduction Forum => Scripting & Kernelhacking => Topic started by: bluelupo on 2013/01/19, 15:18:50
-
Hallo zusammen,
ich habe ein etwas kniffeliges Problem innerhalb eines Shellscriptes das sich wie folgt darstellt.
Das Script wird aufgerufen mit einer Liste von Dateien mit Pfadangabe, zB. so:
$ ./merge4pdf.sh /tmp/dok_01.pdf /tmp/dok_02.pdf
Im Script werden diese beiden PDF-Dateien mit Hilfe von pdftk aneinander gehängt. Das funktioniert aber nur wenn die Dateien keine Leerzeichen enthalten, dann nämlich wird an den Leerzeichen getrennt und es kommen natürlich Dateinamen heraus die so nicht existieren.
Beispielaufruf mit Leerzeichen im Dateinamen:
$ ./merge4pdf.sh /tmp/dok 01.pdf /tmp/dok 02.pdf
Aus diesen beiden Dateinamen wir dann folgende Liste:
/tmp/dok
01.pdf
/tmp/dok
02.pdf
Das kann natürlich funktionieren das dies unsinnige Dateinamen ergibt die nicht existent sind.
Die übergebenen Dateinamen kommen übrigens aus Dateimanager Dolphin in dem ich ein userspez. Kontextmenü (Servicemenü) für PDF-Dateien eingestellt habe. Diese werden mit %U an das Shellscript merge4pdf.sh übergeben und dort mit $@ weiter verarbeitet.
mergePDF.desktop
[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=application/pdf;
Actions=merge4pdf;
Encoding=UTF-8
X-KDE-Priority=TopLevel
[Desktop Action merge4pdf]
Name=PDF Dateien zusammenhängen
Icon=application-pdf
Terminal=true
Exec=/usr/bin/uxterm -e "/usr/local/scripts/merge4pdf.sh %U"
Hier mein Script merge4pdf.sh:
#!/bin/bash
#
ALL_PDF="$@"
COUNTER=0
echo "Die markierten PDF-Dateien..."
echo ""
for NAME in $@
do
echo " $NAME"
FILE=`basename $NAME`
FILE_PRAEFIX=`echo $FILE | cut -d"." -f1`
if [ $COUNTER -eq 0 ]
then
DIRNAME=`dirname $NAME`
MERGE_PDF=$FILE_PRAEFIX
elif [ $COUNTER -gt 0 ]
then
MERGE_PDF=$MERGE_PDF"_"$FILE_PRAEFIX
fi
COUNTER=`expr $COUNTER + 1`
done
echo ""
echo "...werden zu einem Dokument zusammengefügt"
echo ""
MERGE_PDF=$MERGE_PDF".pdf"
pdftk $ALL_PDF cat output $DIRNAME/$MERGE_PDF
echo " $DIRNAME/$MERGE_PDF"
echo ""
echo ""
echo "Fenster bitte schließen mit Taste RETURN"
read RET
Wie kann das Script so gestalten das es auch mit Dateinamen die ein Leerzeichen enthalten funktioniert.
-
Hallo bluelupo,
ich hab gerade nicht viel Zeit und daher Dein merge-Script nicht vollständig gelesen ... aber etwa folgendermaßen solltest Du weiterkommen (s. man bash):
Anstatt
for NAME in $@
besser:
for NAME in "$@"
Und anstatt
FILE=`basename $NAME`
DIRNAME=`dirname $NAME`
besser:
FILE=`basename "$NAME"`
DIRNAME=`dirname "$NAME"`
Bis bald
midrow
-
In der .desktop Datei probieren, enweder oder:
Exec=/usr/bin/uxterm -e /usr/local/scripts/merge4pdf.sh "%U"
Exec=/usr/bin/uxterm -e /usr/local/scripts/merge4pdf.sh '%U'
Exec=/usr/bin/uxterm -e "/usr/local/scripts/merge4pdf.sh '%U'"
Sonst: kann man, im shellscript die parameter natürlich auch wieder zusammenfügen:
if [ -f "$1" ] ; then
...
elif f [ -f "$1 $2" ] ; then
fi
-
Hi,
ich hab's gelöst. Letztendlich lag es an den Blanks als Seperatorzeichen (interne Bashvariable IFS). Die setzte ich im Script jetzt temporär auf den Seperator ";" womit das ganze dann funktioniert.
Hier mein finales Script, das jetzt mit auch mit Dateinamen die ein Leerzeichen enthalten, umgehen kann.
@ralul: deinen Tipp muss ich mal zu Gemüte führen - Danke!
#!/bin/bash
#
ALL_PDF="$@"
COUNTER=0
FILE_LIST=`echo ${ALL_PDF// \//;\/}`
echo "Die markierten PDF-Dateien..."
echo ""
IFS=";"
for NAME in $FILE_LIST
do
echo " $NAME"
FILE=`basename $NAME`
FILE_PRAEFIX=`echo $FILE | cut -d"." -f1`
if [ $COUNTER -eq 0 ]
then
DIRNAME=`dirname $NAME`
MERGE_PDF=$FILE_PRAEFIX
elif [ $COUNTER -gt 0 ]
then
MERGE_PDF=$MERGE_PDF"_"$FILE_PRAEFIX
fi
COUNTER=`expr $COUNTER + 1`
done
NO_BLANKS=`echo $MERGE_PDF | tr -d [:blank:]`
MERGE_PDF=$NO_BLANKS".pdf"
# Einen komletten String für die Verarbeitung mit pdftk erstellen
# IFS muss temp. gesetzt werden, ansnsten erzeugen Dateinamen mit
# Blanks Fehlermeldungen beim pdftk Kommando
COUNTER=0
IFS=";"
for STRING in $FILE_LIST
do
if [ $COUNTER -eq 0 ]
then
ONE_NAME_STRING=$STRING
elif [ $COUNTER -gt 0 ]
then
ONE_NAME_STRING="$ONE_NAME_STRING;$STRING"
fi
COUNTER=`expr $COUNTER + 1`
done
pdftk $ONE_NAME_STRING cat output $DIRNAME/$MERGE_PDF
echo ""
echo "...werden zu einem Dokument zusammengefügt"
echo ""
echo " $DIRNAME/$MERGE_PDF"
echo ""
echo ""
echo "Fenster bitte schließen mit Taste RETURN"
read RET
#EOF