Suchen Sie eine Datei, wenn Sie die Prüfsumme kennen?

29

Ich habe md5sumeine Datei und weiß nicht, wo sie sich auf meinem System befindet. Gibt es eine einfache Möglichkeit find, eine Datei anhand ihrer zu identifizieren md5? Oder muss ich ein kleines Skript entwickeln?

Ich arbeite an AIX 6 ohne die GNU-Tools.

Kiwy
quelle
4
Wäre es nicht schneller, die Suche auf Dateigrößen der gleichen Größe zu beschränken, als den md5 zu berechnen?
RJ
@ RJ- ja vielleicht, aber in diesem Fall kann ich auch überprüfen, ob die Datei die richtige ist und korrekt übertragen wurde.
Kiwy

Antworten:

33

Verwenden von find:

find /tmp/ -type f -exec md5sum {} + | grep '^file_md5sum_to_match'

Wenn Sie suchen, können /Sie das folgende Befehlsbeispiel ausschließen /procund anzeigen:/sysfind

Außerdem hatte ich einige Tests durchgeführt, findmehr Zeit und weniger CPU und RAM, wobei Ruby-Skript weniger Zeit, aber mehr CPU und RAM benötigt

Testergebnis

Finden

[root@dc1 ~]# time find / -type f -not -path "/proc/*" -not -path "/sys/*" -exec md5sum {} + | grep '^304a5fa2727ff9e6e101696a16cb0fc5'
304a5fa2727ff9e6e101696a16cb0fc5  /tmp/file1


real    6m20.113s
user    0m5.469s
sys     0m24.964s

Finden Sie mit -prune

[root@dc1 ~]# time find / \( -path /proc -o -path /sys \) -prune -o -type f -exec md5sum {} + | grep '^304a5fa2727ff9e6e101696a16cb0fc5'
304a5fa2727ff9e6e101696a16cb0fc5  /tmp/file1

real    6m45.539s
user    0m5.758s
sys     0m25.107s

Ruby Script

[root@dc1 ~]# time ruby findm.rb
File Found at: /tmp/file1

real    1m3.065s
user    0m2.231s
sys     0m20.706s
Rahul Patil
quelle
Sie anrufen möchten , -pruneauf /sys/ /procanstatt in ihnen absteigend und Ausschließen von Dateien mit -path. Sie sollten lieber !über -notfür die Portabilität.
Stéphane Chazelas
Sir, ich habe mit -prune aktualisiert, überprüfe einmal, ob es in Ordnung ist.
Rahul Patil
Sie möchten auch /devsicher ausschließen .
Simon Richter
12

Skriptlösung

#!/usr/bin/ruby -w

require 'find'
require 'digest/md5'

file_md5sum_to_match = [ '304a5fa2727ff9e6e101696a16cb0fc5',
                         '0ce6742445e7f4eae3d32b35159af982' ]

Find.find('/') do |f|
  next if /(^\.|^\/proc|^\/sys)/.match(f) # skip
  next unless File.file?(f)
  begin
        md5sum = Digest::MD5.hexdigest(File.read(f))
  rescue
        puts "Error reading #{f} --- MD5 hash not computed."
  end
  if file_md5sum_to_match.include?(md5sum)
       puts "File Found at: #{f}"
       file_md5sum_to_match.delete(md5sum)
  end
  file_md5sum_to_match.empty? && exit # if array empty then exit

end

Bash Script Lösung basierend auf der Wahrscheinlichkeit, die schneller arbeitet

#!/bin/bash
[[ -z $1 ]] && read -p "Enter MD5SUM to search file: " md5 || md5=$1

check_in=( '/home' '/opt' '/tmp' '/etc' '/var' '/usr'  )
last_find_cmd="find / \\( -path /proc -o -path /sys ${check_in[@]/\//-o -path /} \\) -prune -o -type f -exec md5sum {} +"
last_element=${#check_in}
echo "Please wait... searching for file"
for d in ${!check_in[@]}
do

        [[ $d == $last_element ]] && eval $last_find_cmd | grep "^${md5}" && exit

        find ${check_in[$d]} -type f -exec md5sum {} + | grep "^${md5}" && exit


done

Testergebnis

[root@dc1 /]# time bash find.sh 304a5fa2727ff9e6e101696a16cb0fc5
Please wait... searching for file
304a5fa2727ff9e6e101696a16cb0fc5  /var/log/file1

real    0m21.067s
user    0m1.947s
sys     0m2.594s
Rahul Patil
quelle
welches würdest du empfehlen
Kiwy
@ Kiwy Ich bin nicht zu empfehlen, Nur zum Üben
Rahul Patil
@Kiwy schau dir mal das Testergebnis an und lass es mich wissen und mache auch ein paar Tests von deiner Seite und zeige uns das Ergebnis. Es wäre großartig, das Ergebnis unter AIX zu sehen. : D
Rahul Patil
Mein Hauptproblem bei Ihrem Skript ist, dass es Ruby benötigt und nicht auf meinem System installiert ist und ich kein Administrator bin. aber ich werde heute Abend einige Tests durchführen, wenn ich etwas Zeit finde
Kiwy
Es scheint am Ende schneller als zu finden ^^. Vielleicht könnten Sie die md5sum in einen Thread einbinden, um 5 md5sum zu berechnen, und gleichzeitig etwas Zeit sparen
Kiwy
7

Wenn Sie sich trotzdem für die Installation von gnu find entscheiden (und Interesse an einem Ihrer Kommentare angemeldet haben), können Sie Folgendes ausprobieren:

find / -type f \( -exec checkmd5 {} YOURMD5SUM \; -o -quit \) 

und checkmd5vergleichen Sie die MD5-Summe der Datei, die es als Argument erhält, mit dem zweiten Argument und geben Sie den Namen aus, wenn er mit 1 übereinstimmt, und beenden Sie ihn mit 1 (ansonsten mit 0). Das -quitwird findhalt haben sobald es gefunden ist.

checkmd5 (nicht getestet):

#!/bin/bash

md=$(md5sum $1 |  cut -d' ' -f1)

if [ $md == $2 ] ; then
  echo $1
  exit 1
fi
exit 0
Anthon
quelle
Yum No package checkmd5 available, bitte geben Sie an, für welches Paket installiert werden musscheckmd5
Rahul Patil
Ich mag diese Lösung zu schade, dass ich sie nicht verstehe, checkmd5aber ich mag die Art und Weise, wie Sie es tun
Kiwy
@kiwy-Skript hinzugefügt.
Anthon
@ RahulPatil es ist in der DIY-Distribution ;-)
Anthon
@kiwy Tut mir leid, ich hätte deine Bearbeitung für -type fannehmen können, aber es hat meine echo $1bereits eingegebene wiederhergestellt
Anthon