[REQ] Inverse Duplicat Suche

Seite 1 von 1 - Forum: Applications, Apps & Drivers auf overclockers.at

URL: https://www.overclockers.at/applications/req-inverse-duplicat-suche_228178/page_1 - zur Vollversion wechseln!


Lobo schrieb am 08.01.2012 um 19:20

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


Lobo schrieb am 19.01.2012 um 14:31

ok kennt auch keiner was... schade


mr.nice. schrieb am 19.01.2012 um 14:41

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 schrieb am 19.01.2012 um 14:44

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 schrieb am 19.01.2012 um 15:49

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 schrieb am 19.01.2012 um 21:18

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


COLOSSUS schrieb am 20.01.2012 um 15:52

Ah, sehr schoen - ich entnehme dem Thread, dass du das Problem inzwischen geloest hast? :)


Lobo schrieb am 22.01.2012 um 10:56

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




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025