Befehl mit Bedingungen für aufräumendes cp von Datei-Versionen aus einer Verzeichnisstruktur

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Dengo
Beiträge: 251
Registriert: 07.07.2009 18:54:23

Befehl mit Bedingungen für aufräumendes cp von Datei-Versionen aus einer Verzeichnisstruktur

Beitrag von Dengo » 09.08.2023 00:21:22

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

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Befehl mit Bedingungen für aufräumendes cp von Datei-Versionen aus einer Verzeichnisstruktur

Beitrag von tobo » 09.08.2023 17:14:14

So was könntest du mal auf ein Testverzeichnis loslassen:

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
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

Antworten