"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[REQ] Inverse Duplicat Suche

Lobo 08.01.2012 - 19:20 1345 7
Posts

Lobo

Here to stay
Avatar
Registered: May 2002
Location: In da Oaschicht
Posts: 2561
Ich bin auf der Suche nach einem Programm (vorzugsweise Linux), mit dem ich folgendes Szenario abdecken kann:

Ich hab auf meinem Server haufenweise Serien/Backups usw.
Auf diversen externen Festplatten liegen wahrscheinlich auch noch Teile herum, welche schon am Server gesichert sind.

Jetzt bräucht ich halt was, was mir sagt was von Festplatte X noch NICHT auf dem Server ist.

Problem dabei: Die Ordner und Unter-Ordner heißen großteils UNTERSCHIEDLICH auf Festplatte und Server. Selbiges gilt für Dateinamen.

Vergleich müßte halt auf CRC/MD5 basis laufen.

Hab schon selber etwas herumgecoded, aber mein Ansatz ist bis jetzt wenig performant und ich hab auch momentan keine Zeit dazu da mehr zu machen.

Vielleicht weiß ja jemand was!
TIA
Bearbeitet von Lobo am 22.01.2012, 10:56

Lobo

Here to stay
Avatar
Registered: May 2002
Location: In da Oaschicht
Posts: 2561
ok kennt auch keiner was... schade

mr.nice.

differential image maker
Avatar
Registered: Jun 2004
Location: Wien
Posts: 6516
Quelle1: MD5 Checksums einlesen und in eine Textdatei ausgeben.
Quelle2: MD5 Checksums einlesen und in eine Textdatei ausgeben.
...
Textdateien vergleichen und Differenzen in eine Textdatei ausgeben.

Mehr dazu hier:
http://www.explananda.com/2008/05/1...-for-wildcards/

HTH

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12100
Thread erst jetzt gesehen bzw. gezeigt bekommen, und muss sagen: Das ist jetzt so schwer aber nicht?
(ungetestet)
Code:
export LC_ALL=C
find /path1 -type f -exec md5sum {} +| sort -n > path1.txt
find /path2 -type f -exec md5sum {} + | sort -n > path2.txt
comm -1 -3 path1.txt path2.txt #files, die in path2 sind, aber nicht in path1

Reicht dir das?

Edith ruft noch: das ist in etwa das, was mrnice vorgeschlagen hat. Aber halt loeffelbarer ;)

Edith ruft NOCHMALS: Ist so noch nicht ganz fertig - die Dateien beinhalten ja sowohl die Pruefsummen, als auch die relativen Pfade der Dateien. Du musst also path1.txt und path2.txt nochmal weiterverwursten, indem du nur die md5sums rausholst (`awk '{print $1}'`), und dann den Vergleich mittels `comm` ueber diese Files laufen laesst. Die resultierenden Pruefsummen kannst du mit den urspruenglichen Files ("path1.txt" und "path2.txt") wieder zu Pfadinformationen "mappen". Ich kann dir gerne dabei helfen, aber nicht jetzt ;)

Lobo

Here to stay
Avatar
Registered: May 2002
Location: In da Oaschicht
Posts: 2561
Zitat von COLOSSUS
Thread erst jetzt gesehen bzw. gezeigt bekommen, und muss sagen: Das ist jetzt so schwer aber nicht?
(ungetestet)
Code:
export LC_ALL=C
find /path1 -type f -exec md5sum {} +| sort -n > path1.txt
find /path2 -type f -exec md5sum {} + | sort -n > path2.txt
comm -1 -3 path1.txt path2.txt #files, die in path2 sind, aber nicht in path1

Reicht dir das?

Edith ruft noch: das ist in etwa das, was mrnice vorgeschlagen hat. Aber halt loeffelbarer ;)

Edith ruft NOCHMALS: Ist so noch nicht ganz fertig - die Dateien beinhalten ja sowohl die Pruefsummen, als auch die relativen Pfade der Dateien. Du musst also path1.txt und path2.txt nochmal weiterverwursten, indem du nur die md5sums rausholst (`awk '{print $1}'`), und dann den Vergleich mittels `comm` ueber diese Files laufen laesst. Die resultierenden Pruefsummen kannst du mit den urspruenglichen Files ("path1.txt" und "path2.txt") wieder zu Pfadinformationen "mappen". Ich kann dir gerne dabei helfen, aber nicht jetzt ;)

super, danke! lass grad mal die path files erstellen :D
das kann noch ein "bissl" dauern befürcht ich

Lobo

Here to stay
Avatar
Registered: May 2002
Location: In da Oaschicht
Posts: 2561
so, alle schritte durch. musste die md5-datein noch sorten und dann konnt ich "comm" verwenden.

jetzt fehlt nurnoch die Dateinamen aus der "originaldatei" ("path1") heraus zu holen.
gibts da auch einen netten Einzeiler:
stells mir ca. so vor:
awk 'awk '{print}' diff.txt {print $1}' extern.txt
morgen nochmal drüber schaun wie das funkt

ich merks mal wieder was für ein bash schwammerl ich bin :P


edit: join kanns :D
Bearbeitet von Lobo am 19.01.2012, 22:34

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12100
Ah, sehr schoen - ich entnehme dem Thread, dass du das Problem inzwischen geloest hast? :)

Lobo

Here to stay
Avatar
Registered: May 2002
Location: In da Oaschicht
Posts: 2561
Ja ist mittlerweile behoben (denk ich ) :D
Danke nochmal. Hab mir ein kleines Script gebastelt dass ich euch natürlich ned vorenthalten will. (bitte nicht gleich lynchen ist glaub ich das 1. halbwegs sinnvolle Script ...)

Code:
#!/bin/bash

#filename=$(basename $1)
#extension=${filename##*.}
#filename=${filename%.*}


export LC_ALL=C
DIFF="diff.txt"
MISSING="missing_files.txt"

function testing {
    echo "this is just for testing"
}


function md5 {

    if [ $# != 2 ]; then
	echo "Usage: $0 --md5 PATH NAME_OF_DEVICE"
	exit
    fi
    path=$1
    if [ ! -d "$path" ]; then
	echo "Error: $path does not exist";
	exit;
    fi
    dirname=$(basename $1)
    device=$2
    filename=${device}_${dirname}

    
    find $path -type f -exec md5sum {} +| sort > $filename.txt
    awk '{print $1}' $filename.txt | sort > $filename\_md5.txt
}

function compare {
    if [ $# != 3 ]; then
	echo "Usage: $0 -c MD5_FILE1 MD5_FILE2 FILE_WITH_FILENAMES"
	echo "check for files which are in file2 but not in file1"
	exit
    fi
    
    if [ ! -f "$1" ] || [ ! -f "$2" ] || [ ! -f "$3" ]; then
	echo "One File does not exist"
	exit
    fi
    #echo $1 $2
    comm -13 $1 $2 > $DIFF
    join $DIFF $3 | awk -F "  " '{print}'  > $MISSING  

}

case "$1" in
    -c)
	shift
	compare $@
	;;
    --md5)
	shift
	md5 $@
	;;
    --test)
	shift
	testing $@
	;;
    *)
	echo "blubb"
	exit;;
esac
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz