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