J'ai le md5sumfichier et je ne sais pas où il se trouve sur mon système. Existe-t-il une option simple findpour identifier un fichier en fonction de son md5? Ou dois-je développer un petit script?
Je travaille sur AIX 6 sans les outils GNU.
J'ai le md5sumfichier et je ne sais pas où il se trouve sur mon système. Existe-t-il une option simple findpour identifier un fichier en fonction de son md5? Ou dois-je développer un petit script?
Je travaille sur AIX 6 sans les outils GNU.
Réponses:
En utilisant find:
find /tmp/ -type f -exec md5sum {} + | grep '^file_md5sum_to_match'
Si vous recherchez, /vous pouvez exclure /procet /sysvoir l' findexemple de commande suivant :
De plus, j'avais fait des tests, findpris plus de temps et moins de CPU et de RAM où le script ruby prend moins de temps 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
Trouvez 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
-prunesur /sys/ /procau lieu de descendre en eux et exclure les fichiers avec -path. Vous devriez préférer !la -notportabilité.
/devcertainement.
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 la 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 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 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 checkmd5comparer la somme md5 du fichier obtenu en tant qu'argument au deuxième argument et afficher le nom s'il correspond et quitter avec 1 (au lieu de 0 sinon). Le -quitsera findarrêté une fois qu'il sera trouvé.
checkmd5 (pas testé):
#!/bin/bash
md=$(md5sum $1 | cut -d' ' -f1)
if [ $md == $2 ] ; then
echo $1
exit 1
fi
exit 0
No package checkmd5 available, veuillez indiquer pour quel paquet doit être installécheckmd5
checkmd5mais j'aime la façon dont vous la faites
-type f, mais elle a été annulée, je l' echo $1avais déjà insérée