staging.inyokaproject.org

Dateinamen der Ausgabedatei bei Batchkonvertierung

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

BrunoFischer

Avatar von BrunoFischer

Anmeldungsdatum:
4. März 2013

Beiträge: 57

Hallo!

Ich habe ein Verzeichnis in dem liegen 500.000 pdf Dateien. Ich möchte nun, zur Weiterverarbeitung, den Text mit pdftotext in ein Text-File schreiben.

Ich denke es geht so

1
2
3
pdf_pfad = /var/www/pdf_pfad
txt_pfad = /var/www/txt_pfad
find $pfad -type f -name "*pdf" -exec pdftotext -q $i - >> $txt_pfad {} \;

Wie bestimme ich nun die Umleitung? Also ich will den namen wie folgt

Dateiname+.txt also Z.B. test.pdf.txt das dann nach $txt_pfad.

Wie kann ich das machen? irgenwas mit basename... Aber wie?

Bearbeitet von sebix:

Bitte wähle in Zukunft einen aussagekräftigen Titel!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Also - das erste ist, dass die Shell (Bash oder welche auch immer) bei der Variablenzuweisung vor und nach dem "=" keine Leerzeichen duldet.
Die musst Du auf jeden Fall schon mal wegmachen:

1
2
pdf_pfad=/var/www/pdf_pfad
txt_pfad=/var/www/txt_pfad

Dann hast Du nicht "gequotet" - sobald mal ein Leerzeichen im Dateipfad vorkommt geht es schief. Also immer sauber "quoten":

find "$pfad" -type f -name "*pdf" -exec pdftotext -q "$i" - >> "$txt_pfad" {} \;

(immer wenn Leerzeichen in den Variablen vorkommen können !)

Allerdings klappt das so natürlich noch nicht. Woher soll das arme Skript auch wissen, was es für "$i" nehmen soll ...?!

Willst Du tatsächlich die Dateien mit einer *.pdf.txt - Endung bekommen ? - dann brauchst Du die 2. Endung nur dranpappen.
Alternativ kannst Du natürlich auch den Dateipfad mit Hilfe von Parameter Expansions zerlegen und neu zusammenbauen.

Bei find ... -exec geht sowas allerdings nur vernünftig in einer Untershell: (weil man diese blöden "{}" nicht weiter bearbeiten kann !)

find "$pdf_pfad" -type f -name "*.pdf"  -exec bash -c ' datei=${1##*/}; pdftotext -q "$1" > "$txt_pfad/${datei##*.}.txt" '  -- {} \;

Musst Du tatsächlich einen ganzen Verzeichnisbaum abgrasen ? - sonst könntest Du Dir die Untershell nämlich sparen, und einfach eine for ... in - Schleife nehmen. Da kannst Du die Parameter Expansions direkt einsetzen.

LG,

track

BrunoFischer

(Themenstarter)
Avatar von BrunoFischer

Anmeldungsdatum:
4. März 2013

Beiträge: 57

Hall track!

Danke für deine Nachricht!

Es sind auch andere Dateien außer PDF drin.

Es ist aber nur ein Verzeichnis mit den vielen Rechnungen...

Ich finde es am einfachsten einfach ein ".txt" dran zu hängen.

Wie ginge es mit der 2. Variante...?

Danke für die Hilfe!

LG

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Mit einer for-Schleife, die über alle *.pdf-Dateien im aktuellen Arbeitsverzeichnis läuft, sieht es z.B. so aus:

1
2
3
for file in *.pdf; do
    pdftotext -q "$file" "${file}.txt"
done

Wenn man nicht will, dass eine .pdf.txt Endung ensteht, genügt laut Manpage

SYNOPSIS 
       pdftotext [options] [PDF-file [text-file]]

DESCRIPTION
       Pdftotext converts Portable Document Format (PDF) files to plain text.

       Pdftotext reads the PDF file, PDF-file, and writes a text  file,  text-
       file.   If  text-file  is not specified, pdftotext converts file.pdf to
       file.txt.  If text-file is ´-', the text is sent to stdout.

folgendes - man kommt also ohne Parameter Expansion aus:

1
2
3
for file in *.pdf; do
    pdftotext -q "$file"
done

BrunoFischer

(Themenstarter)
Avatar von BrunoFischer

Anmeldungsdatum:
4. März 2013

Beiträge: 57

Hallo seahawk1986!

Das stimmt. Aber ich möchte die entstandene datei in einen anderen Verzeichnis haben.

Wenn ich danach mv mache muss ich den $file noch .PDF nach .Txt ersetzen?

Wie schaut die Zeile inkl Pfad aus?

Danke

Gruß

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Wenn eine .pdf.txt Endung genügt:

1
2
3
4
5
6
7
#!/bin/bash
pdf_pfad='/var/www/pdf_pfad'
txt_pfad='/var/www/txt_pfad'
cd "$pdf_pfad"
for file in *.pdf; do
    pdftotext -q "$file" "${txt_pfad}/${file}.txt"
done

BrunoFischer

(Themenstarter)
Avatar von BrunoFischer

Anmeldungsdatum:
4. März 2013

Beiträge: 57

Cool. Danke.

Und den Befehl sed nutze ich dann zum ersetzen.

Ich teste das morgen auf Arbeit Mal

Herzlichen Dank!

Schönen Abend noch!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Das verstehe ich nicht.

Was willst Du jetzt noch mit sed machen, wenn im Dateinamen gar nichts mehr ersetzt zu werden braucht ?
(oder alternativ: wenn Du die Ersetzung schon mit einer Parameter Expansion erledigst ?)
Oder sprichst Du jetzt schon vom nächsten Schritt, Sachen in den Rechnungstexten zu suchen / zu ersetzen ?

track

BrunoFischer

(Themenstarter)
Avatar von BrunoFischer

Anmeldungsdatum:
4. März 2013

Beiträge: 57

Guten Morgen,

ich wollte mit sed aus $file das .pdf mit .txt ersetzen... Nur als i-Tüpfelchen... ☺

Mokkujin

Anmeldungsdatum:
2. Mai 2008

Beiträge: 389

Hast du dir den Post von seahawk1986 mal durchgelesen .... du machst dir lieber zusätzliche Arbeit ?

folgendes - man kommt also ohne Parameter Expansion aus:

1
2
3
for file in *.pdf; do
    pdftotext -q "$file"
done

BrunoFischer

(Themenstarter)
Avatar von BrunoFischer

Anmeldungsdatum:
4. März 2013

Beiträge: 57

Hallo Mokkujin!

Nein! Denn mein .txt soll eben NICHT in den gleichen Ordner!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

BrunoFischer schrieb:

Guten Morgen,

ich wollte mit sed aus $file das .pdf mit .txt ersetzen... Nur als i-Tüpfelchen... ☺

Wenn du die Methode mit dem direkten Ersetzen der Endung durch pdftotext nicht nutzen willst (danach müsste man ja nur die *.txt Dateien in einen anderen Ordner kopieren), würde ich lieber die von track vorgeschlagenen Parameter Expansion nutzen als da umständlich mit sed herumzuwerkeln:

1
2
3
4
5
6
7
#!/bin/bash
pdf_pfad='/var/www/pdf_pfad'
txt_pfad='/var/www/txt_pfad'
cd "$pdf_pfad"
for file in *.pdf; do
    pdftotext -q "$file" "${txt_pfad}/${file##*.}.txt"
done
Antworten |