J'ai le md5sum
fichier et je ne sais pas où il se trouve sur mon système. Existe-t-il une option simple find
pour 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 md5sum
fichier et je ne sais pas où il se trouve sur mon système. Existe-t-il une option simple find
pour 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 /proc
et /sys
voir l' find
exemple de commande suivant :
De plus, j'avais fait des tests, find
pris 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
-prune
sur /sys
/ /proc
au lieu de descendre en eux et exclure les fichiers avec -path
. Vous devriez préférer !
la -not
portabilité.
/dev
certainement.
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 checkmd5
comparer 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 -quit
sera find
arrê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
checkmd5
mais j'aime la façon dont vous la faites
-type f
, mais elle a été annulée, je l' echo $1
avais déjà insérée