¿Encontrar un archivo cuando sabes su suma de comprobación?

30

Tengo el md5sumarchivo y no sé dónde está en mi sistema. ¿Hay alguna opción fácil de findidentificar un archivo basado en su md5? ¿O necesito desarrollar un pequeño script?

Estoy trabajando en AIX 6 sin las herramientas de GNU.

Kiwy
fuente
44
¿No limitaría la búsqueda a tamaños de archivo del mismo tamaño y luego calcular el md5 sería más rápido?
RJ-
@ RJ- sí, pero en este caso también me permite verificar si el archivo es el correcto y se ha transferido correctamente.
Kiwy

Respuestas:

34

Utilizando find:

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

Si busca /, puede excluir /procy /sysver el siguiente findejemplo de comando:

También hice algunas pruebas, findtomé más tiempo y menos CPU y RAM, donde el script ruby ​​está tomando menos tiempo pero más CPU y RAM

Resultado de la prueba

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

Encuentra con -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
Rahul Patil
fuente
Al que desea llamar -pruneen /sys/ /procen vez de descender en ellos y excluir archivos con -path. Usted debe preferir !sobre -notla portabilidad.
Stéphane Chazelas
Señor, he actualizado con -prune, una vez verifique si está bien.
Rahul Patil
También desea excluir /devciertamente.
Simon Richter
12

Solución 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

Solución Bash Script basada en la probabilidad que funciona más rápido

#!/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 de la prueba

[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
fuente
cual recomendarias
Kiwy
@ Kiwi No lo recomiendo, solo para practicar
Rahul Patil
@Kiwy una vez mire el resultado de la prueba y hágamelo saber y también haga algunas pruebas de su lado y muéstrenos el resultado, sería genial ver el resultado en AIX. : D
Rahul Patil
Mi principal problema con su script es que necesita ruby ​​y no está instalado en mi sistema, y ​​no soy administrador. pero haré algunas pruebas esta noche si encuentro algo de tiempo
Kiwy
Parece más rápido que encontrar al final ^^. tal vez podría poner el md5sum en un hilo para que pueda calcular 5 md5sum al mismo tiempo que también podría ahorrar un poco de tiempo
Kiwy
7

Si decide instalar gnu find de todos modos (y dado que indicó interés en uno de sus comentarios), puede intentar algo como:

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

y checkmd5comparar el md5sum del archivo que obtiene como argumento comparar con el segundo argumento e imprimir el nombre si coincide y salir con 1 (en caso contrario con 0). El -quittendrá que findparar una vez que se encuentra.

checkmd5 (no probado):

#!/bin/bash

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

if [ $md == $2 ] ; then
  echo $1
  exit 1
fi
exit 0
Anthon
fuente
Yum No package checkmd5 available, por favor incluya para qué paquete debe instalarsecheckmd5
Rahul Patil
Esta solución me gusta demasiado, no la entiendo, checkmd5pero me gusta cómo lo haces
Kiwy
Se agregó el script @kiwy.
Anthon
@RahulPatil está en la distribución de bricolaje ;-)
Anthon
@kiwy Lo siento, podría haber aceptado tu edición -type f, pero me recuperó el echo $1que ya había puesto
Anthon