Suchen einer Datei mit md5sum

1542
gojira

Angesichts der md5sum einer Datei möchte ich wissen, ob sich an einer anderen Datei im Verzeichnisbaum eine andere Datei mit der gleichen md5sum befindet (möglicherweise aber unter einem anderen Namen). Wie kann ich das in bash machen?

PS: Um dies zu betonen, sollte dies für den gesamten Baum unterhalb eines bestimmten Verzeichnisses funktionieren, dh es muss rekursiv arbeiten, nicht nur im aktuellen Verzeichnis.

1

3 Antworten auf die Frage

2
slhck

Verwenden Sie findzum rekursiven Testen aller Dateien:

find . -type f -exec \ bash -c 'md5sum "$0" | grep -q 2690d194b68463c5a6dd53d32ba573c7 && echo $0' {} \; 

Hier werden md5sumdie MD5-Summe und der Dateiname ausgegeben. Sie müssen grepes für die tatsächliche MD5-Summe eingeben, da es keinen Schalter gibt, um nur die Summe alleine auszugeben.

Sie können die MD5-Summe viel einfacher überprüfen, md5wenn Sie BSD oder OS X verwenden:

find . -type f -exec \ bash -c '[ "$(md5 -q "$0")" = 2690d194b68463c5a6dd53d32ba573c7 ] && echo $0' {} \; 
Danke, slhck sieht sehr interessant aus, aber mein md5-Befehl hat anscheinend keine Option -q. Mein md5sum hat auch keinen Befehl. Ich verwende Xubuntu. Wofür ist das {} \? gojira vor 10 Jahren 0
Entschuldigung, ich hatte hier das falsche BSD-Tool "md5". Unter Linux benötigen Sie "md5sum". Ich werde meinen Beitrag korrigieren, wenn ich wieder auf einem Computer bin. {} Ist der Dateipfad für jede gefundene Datei. Es wird an "sh" übergeben. Das \; beendet einfach den `exec'-Aufruf. slhck vor 10 Jahren 0
2
David Foerster

Die anderen Lösungen sind gut, aber ich möchte eine mit weniger erzeugten Prozessen vorschlagen, die für viele kleine Dateien wesentlich schneller sein sollte, wenn Sie GNU-Dateien gefunden haben:

find /path/to/tree -type f -exec md5sum \{\} + | sed -nre 's/^md5-to-search-for //p' 

oder ohne GNU find:

find /path/to/tree -type f -print0 | xargs -r -0 -- md5sum | sed -nre 's/^md5-to-search-for //p' 
1
tbrixen

Ich habe mir etwas von der Lösung von slhck geliehen

find . -type f -print0 | while read -r -d '' f; do md5sum "$f" | grep "$1" done 

Dabei ist $ 1 das erste Argument. Wenn Sie nach einem fehlenden Argument suchen möchten, starten Sie die Datei mit:

if [ -z "$1" ] then echo "No argument supplied" exit fi 
Dies unterbricht, wenn Dateien Leerzeichen in ihrem Pfad enthalten. Um Dateien zu durchlaufen, sollten Sie `find` mit` exec` oder Globbing verwenden (zB `**`). slhck vor 10 Jahren 0
Eine andere Option wäre die Verwendung von `-print0` in Ihrem` find`-Befehl und `xargs -0`. In diesem Fall also `find. -type f -print0 | xargs -0 md5 | grep (Ihr MD5-Code) ` Kent vor 10 Jahren 0
Ich mag diese Lösung sehr. Es gibt jedoch eine Unmenge von Nachrichten auf stderr: "md5sum: somefilename: Keine solche Datei oder Verzeichnis". Ich frage mich, ob es einen Weg gibt, das zu unterdrücken? gojira vor 10 Jahren 0
@gojira Wenn Sie eine "keine solche Datei oder ein solches Verzeichnis" erhalten, liegt dies wahrscheinlich daran, dass die Dateien Leerzeichen enthalten und der Befehl von brixenDK bei diesem Vorgang unterbrochen wird (aufgrund von `for f in ...`). Wenn eine Datei beispielsweise "foo bar" genannt wurde, würde sie versuchen, eine MD5-Summe für "foo" und "bar" zu machen, die beide nicht existieren. Eine gute Erklärung, warum dies geschieht und wie Sie dies vermeiden können, finden Sie unter: http://mywiki.wooledge.org/ParsingLs slhck vor 10 Jahren 1