Hallo,
im Laufe der Jahre habe ich mir eine wirklich große Sammlung von digitalisierten Büchern beschaffen. Hin und wieder wurden Sicherungen erstellt und die Baustellen wurden diskontinuierlich im Laufe der Zeit in Angriff genommen. Auch wurde Texterkennung gemacht, eine weitere Quelle für neue Versionen einer Datei/Buch. Es wird davon ausgegangen, dass die Bezeichnung der verschiedenen Kopieren bzw. Versionen eines Buches konsistent sind, d.h. gleich gehalten sind. Nun liegen diese halb-chaotische Verzeichnisse alle in ein Hauptverzeichnis - liegt 2x vor. Viele Bücher befinden sich also mehrmals darin, in gleicher oder in verschiedenen Versionen. Nun möchte ich aus diesem Klumpen durch einen oder einigen Befehle aufräumen, um Redundanzen zu beseitigen. Im Endergebnis sollen die Buchdateien alle in einem einfachen Verzeichnis liegen. Das verwendete Format ist PDF.
Folgende Kriterien sollen beim Kopieren berücksichtigt werden:
1. Jedes Buch soll in seinen verschiedenen vorhandenen Versionen ins Zielverzeichnis kopiert werden;
2. In jeder Version soll das Buch lediglich einmal abgelegt werden. Die Version lässt sich an die Dateigröße festmachen: Dateien mit gleichen Namen und gleicher Größe gehören zur gleichen Version und nur ein Exemplar davon soll im Zielverzeichnis landen.
3. Die verschiedenen Versionen eines Buches tragen also den gleichen Namen, belegen jedoch unterschiedlich viel Speicher. Damit sie dennoch ins selbige Verzeichnis kopiert werden können, könnte man z.B. vor ".pdf" das Zeichen "_" hinzufügen. Wenn also während des Kopiervorganges die Datei bereits im Zielverzeichnis vorhanden ist, zuerst prüfen, ob die Größen gleich sind Falls JA, den Kopiervorgang der Datei überspringen; falls Nein, die Datei mit einem "_"-Zeichnen am Ende erweitern und ins Zielverzeichnis kopieren. Liegt ein Buch in 4 unterschiedlichen Versionen vor, so würden sie etwa so im Zielverzeichnis aussehen:
Spiegel_Andre_2006_Die_Befreiung_der_Information_GNU_Linux_und_die_Folgen.pdf
Spiegel_Andre_2006_Die_Befreiung_der_Information_GNU_Linux_und_die_Folgen_.pdf
Spiegel_Andre_2006_Die_Befreiung_der_Information_GNU_Linux_und_die_Folgen___.pdf
Spiegel_Andre_2006_Die_Befreiung_der_Information_GNU_Linux_und_die_Folgen____.pdf
Wie seht ihr es? Lässt sich einen solchen Befehl herzaubern? Könnt ihr mir dabei helfen?
Ein solcher Befehl wäre sehr hilfreich! Für Tipps bin ich sehr dankbar!
Viele Grüße
dengo
Befehl mit Bedingungen für aufräumendes cp von Datei-Versionen aus einer Verzeichnisstruktur
Re: Befehl mit Bedingungen für aufräumendes cp von Datei-Versionen aus einer Verzeichnisstruktur
So was könntest du mal auf ein Testverzeichnis loslassen:
Speichern z.B. mit dem Namen script.sh, dann ausführbar machen mit `chmod u+x script.sh' und dann Starten mit z.B. `./script.sh quellverzeichnis zielverzeichnis' aus dem Arbeitsverzeichnis heraus.
Da gibt's Potenzial zur Verbesserung, aber für einen einmaligen Lauf sollte das ok sein!?
Edit: rename aktualisiert
Code: Alles auswählen
#!/bin/sh
## Quell- und Zielverzeichnis als Parameter, absolut oder lokal zum Arbeitsverzeichnis
QUELLE=$1
ZIEL=$2
## Dateiendung normalisieren, Dateien eindeutig umbenennen und verschieben
find "$QUELLE" -type f -iname '*.pdf' -exec rename 's/(.*)\.[pP][dD][fF]/$1.pdf/' {} \;
find "$QUELLE" -type f -name '*.pdf' -exec cp --backup=numbered {} "$ZIEL"/ \;
## Dubletten löschen
for f in "$ZIEL"/*.pdf; do
for f1 in "$f"*; do
for f2 in "$f"*; do
[ -f "$f1" ] && [ -f "$f2" ] &&
[ "$f1" != "$f2" ] &&
[ `stat -c %s "$f1"` = `stat -c %s "$f2"` ] &&
rm "$f2"
done
done
done
## Umbenennen nach Schema
for f in "$ZIEL"/*.pdf; do
for f1 in "$f"*~; do
[ -f "$f1" ] && {
fn="${f1%.pdf*}_.pdf";
until [ ! -f "$fn" ]; do
fn="${fn%.pdf*}_.pdf"
done
mv "$f1" "$fn"; }
done
done
Da gibt's Potenzial zur Verbesserung, aber für einen einmaligen Lauf sollte das ok sein!?
Edit: rename aktualisiert