Brauche Hilfe mit Linux-Bash-Skript, finde PDF-Dateien rekursiv und optimiere diese, behalte den ursprünglichen Zeitstempel bei

Brauche Hilfe mit Linux-Bash-Skript, finde PDF-Dateien rekursiv und optimiere diese, behalte den ursprünglichen Zeitstempel bei

Ich habe bereits versucht, hier eine Antwort zu finden, aber keine gefunden. Es tut mir leid, dass mein Englisch schlecht ist, denn es fällt mir etwas schwer, Englisch zu sprechen. Ich habe auch fast keine Bash-Skriptkenntnisse, daher sieht mein Skript möglicherweise sehr schlecht aus. Es besteht nur aus Beispielen, die ich im Internet finden konnte, aber jetzt stecke ich damit fest und brauche eure Hilfe!

Was ich von diesem Skript brauche, ist:

  1. Alle PDF-Dateien rekursiv suchen (das Simple Machines Forum hasht Anhänge, daher die Erweiterung .dat)
  2. Identifizieren Sie den PDF-Typ anhand von DAT-Dateien
  3. Dann muss ich das Programm ps2pdf verwenden, um alle neuen (letzten 24 Stunden) PDF-Dateien zu optimieren
  4. Ich muss auch den ursprünglichen Zeitstempel von optimierten PDF-Dateien beibehalten
  5. Diese „24h-pdf-compress-“ date +"%d-%m-%Y"„.txt“-Datei dient nur zum Protokollieren, damit ich später überprüfen kann, ob sie funktioniert.

Die Verzeichnisstruktur für Anhänge im SMF-Forum ist wie folgt:

Unter dem Anhangsordner gibt es einen Ordner für das Jahr (2020).
Unter jedem Jahr gibt es einen Ordner für den Monat (04 = April).
Unter jedem Monat befinden sich alle Anhangsdateien aus diesem Monat.
Alle Dateien (jpg, png, pdf) haben dieselbe Erweiterung .dat.

/var/www/foorumi/attachments/2020/04/all-files-from-april.dat

Mein Skript:

#!/bin/bash

cd /var/www/foorumi/attachments

find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 > "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt"
find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 | while read -r file

do
        touch -r "$file" "dummy_file"
        ps2pdf "$file" "new_$file" # PROBLEM
        rm "$file"
        mv "new_$file" "$file" # PROBLEM
        touch -r "dummy_file" "$file"
        rm dummy_file
done

mv "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt" /root/24h_pdf_compress_log
find . -iname '*.dat' -user root -exec chown www-data:www-data {} \;

exit 0

Ok, das Problem ist folgendes. Wenn ich find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1es ausführe, druckt es Dateien wie ./04/somepdfattachment.dat, also ps2pdf "$file" "new_$file"versucht es beim Ausführen des Skripts, einen neuen Dateinamen wie new_./04/somepdfattachment.dat.. zu erstellen, das klingt nicht richtig.

Der nächste Fehler tritt auf, wenn das Skript versucht, die Datei umzubenennen mv "new_$file" "$file", weil es nun versucht, new_./04/somepdfattachment.datdie Datei wieder auf ihren ursprünglichen Dateinamen umzubenennen.

Ich hoffe, Sie verstehen, was ich Ihnen sagen möchte. Bei Bedarf kann ich weitere Informationen bereitstellen.

Dank im Voraus!

AKTUALISIEREN! Wie @pLumo vorgeschlagen hat, habe ich das Skript geändert und es scheint jetzt zu funktionieren. Ich hoffe, ich habe die Vorschläge richtig verstanden.

Anhänge im Simple Machines-Forum werden folgendermaßen benannt: 403_57066cef00fb1d57137b5613f076d254e89b88bc.dat
„403“ = sind laufende Nummern für Anhänge, dann kommt 404 und dann 405 und so weiter.
„57066cef00...“ = ist ein zufälliger Hash
. „.dat“ = alle Anhangserweiterungen (jpg, png, pdf) werden nach dem Hochladen in .dat umbenannt.

Aktualisiertes Skript:

...
do
        touch -r "$file" "dummy_file"
        newname="$(dirname "$file")/new_$(basename "$file")"
        ps2pdf "$file" "$newname" || continue
        rm "$file"
        mv "$newname" "$file"
        touch -r "dummy_file" "$file"
        rm dummy_file
done
...

Antwort1

$fileSie müssen es in Pfad ( dirname) und Dateinamen ( ) aufteilen basenameund Folgendes new_dazwischen einfügen:

newname="$(dirname "$file")/new_$(basename "$file")"
ps2pdf "$file" "$newname"

Weitere Hinweise:

  • Ihr findBefehl ist nicht sicher, wenn Sie Zeilenumbrüche in den Ergebnissen haben, denn das wird Ihre Ergebnisse vermasseln. Sie sollten sich vielleicht mit dem Null-Trennzeichen vertraut machen, um Dateinamen sicher weiterzuleiten.
  • Ich denke, das Gleiche gilt, wenn die Dateinamen Doppelpunkte enthalten, da die cutTrennung an der falschen Stelle erfolgt.
  • Verwenden Sie -execstattdessen xargs:find . -name '*.dat' -mtime -1 -exec file -i {} +
  • Wenn ps2pdfdies fehlschlägt, machen Sie trotzdem weiter und löschen die Originaldatei. Sie können beispielsweise Folgendes verwenden: ps2pdf ... || continueum bei einem Fehler zur nächsten Iteration zu springen.
  • Bitte verwenden Sie einen aussagekräftigeren Titel, dann kann Ihre Frage auch anderen helfen.

verwandte Informationen