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.
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
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
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