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


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

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.