Encontre um arquivo quando souber sua soma de verificação?

30

Eu tenho o md5sumarquivo e não sei onde ele está no meu sistema. Existe alguma opção fácil de findidentificar um arquivo com base nele md5? Ou preciso desenvolver um pequeno script?

Estou trabalhando no AIX 6 sem as ferramentas GNU.

Kiwy
fonte
4
Não seria mais rápido restringir a pesquisa a tamanhos de arquivo do mesmo tamanho que computar o md5?
RJ-
@ RJ- sim, talvez, mas neste caso também me permite verificar se o arquivo é o correto e foi transferido corretamente.
Kiwy

Respostas:

34

Usando find:

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

Se você pesquisar /, poderá excluir /proce /sysver o seguinte findexemplo de comando:

Também fiz alguns testes, findlevei mais tempo e menos CPU e RAM, onde o script ruby ​​está demorando menos, mas mais CPU e RAM

Resultado do teste

Encontrar

[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

Localizar com -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 Ruby

[root@dc1 ~]# time ruby findm.rb
File Found at: /tmp/file1

real    1m3.065s
user    0m2.231s
sys     0m20.706s
Rahul Patil
fonte
Você deseja chamar / -pruneem vez de descer neles e excluir arquivos com . Você deve preferir a portabilidade. /sys/proc-path!-not
Stéphane Chazelas
Senhor, eu atualizei com -prune, uma vez verifique se está OK.
Rahul Patil
Você também deseja excluir com /devcerteza.
Simon Richter
12

Solução 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

Solução Bash Script com base na probabilidade que funciona mais rapidamente

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

Resultado do teste

[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
Rahul Patil
fonte
qual você recomendaria?
Kiwy
@Kiwy Não estou recomendar, apenas para a prática
Rahul Patil
O @Kiwy olhou uma vez para o resultado do teste e me avise e também faça alguns testes do seu lado e nos mostre o resultado. Seria ótimo ver o resultado no AIX. : D
Rahul Patil
Meu principal problema com o seu script é que ele precisa de ruby ​​e não está instalado no meu sistema, e eu não sou administrador. mas eu vou correr alguns testes esta noite se eu encontrar algum tempo
kiwy
Parece mais rápido do que encontrar no final ^^. talvez você poderia colocar o md5sum em um segmento para que possa calcular 5 md5sum, ao mesmo tempo que poderia salvar também um pouco de tempo
kiwy
7

Se você decidir instalar o gnu find de qualquer maneira (e como você indicou interesse em um de seus comentários), tente algo como:

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

e checkmd5compare o md5sum do arquivo que ele obtém como argumento, compare com o segundo argumento e imprima o nome se ele corresponder e saia com 1 (em vez de 0 caso contrário). O -quitirá findparar quando for encontrado.

checkmd5 (não testado):

#!/bin/bash

md=$(md5sum $1 |  cut -d' ' -f1)

if [ $md == $2 ] ; then
  echo $1
  exit 1
fi
exit 0
Anthon
fonte
Yum No package checkmd5 available, por favor inclua o qual necessidade pacote a ser instalados paracheckmd5
Rahul Patil
Eu gosto desta solução muito ruim eu não entendo checkmd5, mas eu gosto da maneira como você fazê-lo
kiwy
Script @kiwy adicionado.
Anthon
@RahulPatil está na distribuição de bricolage ;-) #
Anthon
@kiwy Desculpe poderia ter aceitado a sua edição para -type f, mas não eliminado minha echo $1Eu já tinha colocado em
Anthon