Ich versuche, alle Dateien in zwei Ordnern über eine MD5-Summe in einem Befehl zu vergleichen. Einige wie das Folgende (Bash) in Debian:
$ cd ~/FOLDER1
$ md5sum ~/FOLDER2/* | md5sum -c -
Die Idee ist, dass die Ausgabe der Hashes der ersten MD5-Summe an die zweite übergeben und als Eingabedatei verwendet wird. Tests zeigen jedoch, dass nur jede Datei in FOLDER2 mit sich selbst verglichen wird und für jede Datei „OK“ zurückgegeben wird. Ich denke, der Grund, warum dies nicht funktioniert, liegt darin, dass die von der ersten MD5-Summe ausgegebenen Dateinamen den vollständigen Pfad enthalten. Ich habe nachgeschaut, md5deep
aber nichts gefunden, was mir dabei geholfen hätte. Ich weiß, dass es möglich ist, die MD5-Summe für einen Ordner zu erstellen, die Ergebnisse in eine Datei zu schreiben und diese Datei dann als Eingabe für die zweite MD5-Summe zu verwenden. Ich wollte alles in einer Zeile über eine Pipe erledigen, anstatt zwei Befehle zu verwenden und eine Datei auszugeben.
Bearbeiten: Die akzeptierte AntwortHier(mit diff
) könnte das bewirken, was ich will, aber ich weiß nicht, ob diff
Binärdateien (richtig) verglichen werden.
Bearbeiten: Um die gewünschte Ausgabe mit md5sum zu erhalten (die den Dateinamen und „OK“ anzeigt), habe ich eine Batchdatei geschrieben. Ausführen mit diffFolders.sh ~/FOLDER1 ~/FOLDER2
.
#!/bin/bash
HERE=$PWD
cd "$1"
md5sum * > /tmp/md5sum.cmp
cd "$2"
md5sum -c /tmp/md5sum.cmp
cd $HERE
Dieses Skript vergleicht nur Dateien, die in vorhanden sind ~/FOLDER
. Wenn ~/FOLDER2
weitere Dateien vorhanden sind, werden diese nicht verglichen und es wird keine Ausgabe angezeigt, die darauf hinweist, dass sie überhaupt vorhanden sind.
Antwort1
Sie könnenProzesssubstitutionum die Ausgabe der beiden MD5-Summen an diff zu übergeben. In diesem Fall wäre Diff in Ordnung, da die MD5-Ausgaben einfacher Text sind. So etwas wie:
diff <(md5 ~/FOLDER1/* | awk '{print $4}') <(md5 ~/FOLDER2/* | awk '{print $4}')
Tut mir leid, ich habe hier kein Debian und kann das nicht darauf testen. Das Obige wurde auf OS X getestet, das MD5 hat, was in Bezug auf die Ausgabe etwas anders sein kann. Auf OS X ist die 4. Spalte von MD5 die eigentliche MD5-Summe, deshalb nehme ich nur diese Spalten.
Anstelle von awk können Sie auch verwenden cut
, aber Sie müssen möglicherweise das Trennzeichen ändern, um die vierte Spalte zu erhalten (diese sind nicht durch Tabulatoren getrennt).
Antwort2
Aus meiner .bashrc-Datei.
sehr altes Zeug, es sollte möglich sein, viel einfacheren Code zu schreiben. Ich bin nie dazu gekommen, ihn neu zu schreiben. (Wie alles andere, das als vorübergehende Lösung gedacht war, wurde es für immer verwendet.) Ich poste diesen beschämenden Code, hoffentlich kann es jemand besser machen und das Ergebnis posten :-)
Merkmale :
- Recrusive dir transversal
- MD5Sum-Prüfung auf Eindeutigkeit/Unterschied
- Listet aktualisierte Dateien im vollständigen Pfad auf
Der Code sagt alles. arg1 ist das alte Verzeichnis, arg2 ist das neue Verzeichnis.
function find-updated-files-between-old-new(){
[ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( ( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n")
)|sort -k1.2|tee 1>/dev/null >(uniq -us1|awk -v B="$2" 'BEGIN{sub("/$",""B)}/^-/{print B substr($0,3);
}') >(uniq -ds1|awk -vA="$1" -vB="$2" 'BEGIN{B=g(B);A=g(A)}{
C=substr($0,3);if(f(A)!=f(B))print B C;}function g(y){sub("/$","",y);return y}
function f(y,z,e){e="md5sum \""y""C"\"";e|getline z;close(e);return substr(z,1,32)}' )
) | cat
}
Wie der Funktionsname schon sagt
function find-files-name-collision-between-dir1dir2(){
[ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n") )|sort -k 1.2 | uniq -d -s 1
}
Nur der Vollständigkeit halber
function mv-mergedir1todir2(){
[ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." && return 1;
( cd "$1" ; tar cf - . ) | (cd "$2" ; tar --keep-old-files xvf - )
echo -e "Done. Duplicate filnames are not replaced. \n#Use \n# ( cd \"$1\" ; tar cf - . ) | (cd \"$2\" ; tar --overwrite xvf - ) \n#if you do not like that. "
}
Dieses furchtbare Stück Code sollte aus meiner Bashrc entfernt werden, allerdings existiert es schon seit langer Zeit ...
Antwort3
Ziemlich lang, gibt aber den Dateinamen und OK zurück, wenn sie übereinstimmen. Anstatt „-c“ zu verwenden, werden nur die beiden Zeichenfolgen verglichen, die beim Ausführen von md5sum für die Datei in jedem Ordner ausgegeben werden.
for f in *; do [[ -f $f ]] && if [ $(md5sum "$f" | cut -d" " -f1) == $(md5sum dir2/"$f" | cut -d" " -f1) ]; then echo "$f" "OK"; else echo "$f" "MODIFIED"; fi; done