web-dev-qa-db-fra.com

Trouvez un fichier lorsque vous connaissez sa somme de contrôle?

J'ai le md5sum d'un fichier et je ne sais pas où il se trouve sur mon système. Existe-t-il une option facile de find pour identifier un fichier en fonction de son md5? Ou dois-je développer un petit script?

Je travaille sur AIX 6 sans le GNU Outils.

32
Kiwy

En utilisant find:

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

Si vous cherchez / alors vous pouvez exclure /proc et /sys Voir suit find Exemple de commande:

Aussi j'avais fait des tests, find prend plus de temps et moins de CPU et RAM Où Ruby prend moins de temps mais plus de CPU et RAM

résultat de test

Trouver

[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

trouver avec -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

Script rubis

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

real    1m3.065s
user    0m2.231s
sys     0m20.706s
36
Rahul Patil

Solution de script

#!/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

Solution de script Bash basée sur une probabilité qui fonctionne plus rapidement

#!/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

résultat de test

[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
12
Rahul Patil

Si vous décidez d'installer GNU, trouvez de toute façon (et puisque vous avez indiqué votre intérêt pour l'un de vos commentaires), vous pouvez essayer quelque chose comme:

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

et ont checkmd5 Comparez le MD5Sum du fichier Il obtient en tant qu'argument de comparer au deuxième argument et imprimez le nom s'il correspond à 1 (au lieu de 0 sinon). Les -quit aura find arrêter une fois qu'il est trouvé.

checkmd5 (pas testé):

#!/bin/bash

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

if [ $md == $2 ] ; then
  echo $1
  exit 1
fi
exit 0
7
Anthon