Ich habe den folgenden Befehl verwendet, um alle jpg
Dateien in einem Verzeichnis in eine einzelne PDF-Datei zu konvertieren und zusammenzuführen .
convert *.jpg file.pdf
Die Dateien im Verzeichnis sind von 1.jpg
bis nummeriert 123.jpg
. Die Konvertierung verlief einwandfrei, aber nach der Konvertierung waren alle Seiten durcheinander. Ich wollte, dass das PDF Seiten von 1.jpg
bis 123.jpg
in derselben Reihenfolge enthält , in der sie benannt sind. Ich habe es auch mit folgendem Befehl versucht:
cd 1
FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
mkdir temp && cd temp
for file in $FILES; do
BASE=$(echo $file | sed 's/.jpg//g');
convert ../$BASE.jpg $BASE.pdf;
done &&
pdftk *pdf cat output ../1.pdf &&
cd ..
rm -rf temp
Aber immer noch kein Glück. Betriebssystem Linux.
convert
Befehl ist Teil desimagemagick
Pakets.Antworten:
Das Problem ist, dass Ihre Shell den Platzhalter in einer rein alphabetischen Reihenfolge erweitert und die Länge der Zahlen unterschiedlich ist. Die Reihenfolge ist falsch:
$ echo *.jpg 1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...
Die Lösung besteht darin, die Dateinamen nach Bedarf mit Nullen aufzufüllen, damit sie dieselbe Länge haben, bevor Sie den Befehl convert ausführen:
$ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`; > padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done
Jetzt werden die Dateien vom Platzhalter in der richtigen Reihenfolge abgeglichen, bereit für den Konvertierungsbefehl:
$ echo *.jpg 001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...
quelle
sh
Datei mit Ihrem Code erstellt. Aber es zeigt den folgenden Fehler während des Laufens:rename.sh: 2: rename.sh: Bad substitution
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)
source
oder.
oder mit einer Shebang-Linie? Haben Sie versucht, den Code einfach direkt in der interaktiven Shell auszuführen?sh
ist fast immer nicht dasselbe wiebash
. Es ist normalerweise die einfache Bourne-Shell oder wirdbash
in einem speziellen Bourne-Emulationsmodus ausgeführt. In beiden Fällen kann die Syntax fürsh
manchmal sehr unterschiedlich sein. Ich würde vorschlagen,bash rename.sh
stattdessen zu verwenden.Oder lesen Sie einfach das
ls
Handbuch und sehen Sie:Also tun, was wir brauchen, in einem einzigen Befehl.
Viel Spaß;) F.
quelle
*.JPG
und nicht als speichern*.jpg
?ls -t
Flag. Außerdem-r
kehrt das Flag die Reihenfolge um.convert-im6.q16: not authorized
fehl : foobar.pdf'`. Offensichtlich ist dies ein Sicherheitsproblem, das über diesen Thread behoben werdenSo mache ich das: In der
ersten Zeile konvertieren Sie alle JPG-Dateien in PDF, wobei der Befehl convert verwendet wird.
In der zweiten Zeile werden alle PDF-Dateien zu einer einzigen PDF-Datei pro Seite zusammengeführt. Dies verwendet gs ((PostScript- und PDF-Sprachinterpreter und Previewer))
for i in $(find . -maxdepth 1 -name "*.jpg" -print); do convert $i ${i//jpg/pdf}; done gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_file.pdf -dBATCH `find . -maxdepth 1 -name "*.pdf" -print"`
quelle
Du könntest benutzen
convert '%d.jpg[1-132]' file.pdf
über https://www.imagemagick.org/script/command-line-processing.php :
Siehe auch https://www.imagemagick.org/script/convert.php
quelle
Alle oben genannten Antworten sind für mich fehlgeschlagen, als ich viele hochauflösende JPEG-Bilder (aus einem gescannten Buch) zusammenführen wollte.
Imagemagick hat versucht, alle Dateien in den Arbeitsspeicher zu laden. Daher habe ich den folgenden zweistufigen Ansatz verwendet:
find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf pdfunite *.pdf merged_file.pdf
Beachten Sie, dass Sie bei diesem Ansatz GNU auch parallel verwenden können, um die Konvertierung zu beschleunigen:
find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf
quelle
Wenn ich die erste Idee mit ihrer Antwort mische, denke ich, dass dieser Code vielleicht zufriedenstellend ist
jpgs2pdf.sh #!/bin/bash cd $1 FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2) mkdir temp > /dev/null cd temp for file in $FILES; do BASE=$(echo $file | sed 's/.jpg//g'); convert ../$BASE.jpg $BASE.pdf; done && pdftk `ls -v *pdf` cat output ../`basename $1`.pdf cd .. rm -rf temp
quelle