[REQ] Inverse Duplicat Suche
Lobo 08.01.2012 - 19:20 1345 7
Lobo
Here to stay
|
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
|
ok kennt auch keiner was... schade
|
mr.nice.
differential image maker
|
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
AdministratorGNUltra
|
Thread erst jetzt gesehen bzw. gezeigt bekommen, und muss sagen: Das ist jetzt so schwer aber nicht? (ungetestet) 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
|
Thread erst jetzt gesehen bzw. gezeigt bekommen, und muss sagen: Das ist jetzt so schwer aber nicht? (ungetestet)
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 das kann noch ein "bissl" dauern befürcht ich
|
Lobo
Here to stay
|
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
Bearbeitet von Lobo am 19.01.2012, 22:34
|
COLOSSUS
AdministratorGNUltra
|
Ah, sehr schoen - ich entnehme dem Thread, dass du das Problem inzwischen geloest hast?
|
Lobo
Here to stay
|
Ja ist mittlerweile behoben (denk ich ) 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 ...) #!/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
|