Trouver un file lorsque vous connaissez sa sum de contrôle?

J'ai le md5sum d'un file et je ne sais pas où il se trouve sur mon système. Y at-il une option facile de find pour identifier un file basé sur son md5 ? Ou ai-je besoin de développer un petit script?

Je travaille sur AIX 6 sans les outils GNU.

À l'aide de find :

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

Si vous effectuez une search dans / vous pouvez exclure /proc et /sys voir l'exemple suivant de la command find :

J'ai également fait quelques tests, find plus de time et less de CPU et de RAM où le script ruby ​​prend less de time mais plus de CPU et de RAM

Résultat du 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 

Ruby Script

 [root@dc1 ~]# time ruby findm.rb File Found at: /tmp/file1 real 1m3.065s user 0m2.231s sys 0m20.706s 

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 Bash Script basée sur une probabilité qui fonctionne plus vite

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

Si vous décidez d'installer gnu find quand même (et depuis que vous avez indiqué un intérêt pour un de vos commentaires), vous pouvez essayer quelque chose comme:

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

et avoir checkmd5 comparer le md5sum du file qu'il obtient comme argument comparer au deuxième argument et imprimer le nom s'il correspond et sortir avec 1 (au lieu de 0 sinon). Le -quit aura find arrêter une fois qu'il est trouvé.

checkmd5 (non testé):

 #!/bin/bash md=$(md5sum $1 | cut -d' ' -f1) if [ $md == $2 ] ; then echo $1 exit 1 fi exit 0