Trova un file quando conosci il suo checksum?


30

Ho md5sumun file e non so dove si trova sul mio sistema. Esiste una semplice opzione findper identificare un file in base al suo md5? O devo sviluppare una piccola sceneggiatura?

Sto lavorando su AIX 6 senza gli strumenti GNU.


4
Restringere la ricerca a dimensioni di file della stessa dimensione non sarebbe più veloce se si calcolasse il md5?
RJ

@ RJ- sì forse ma in questo caso mi consente anche di verificare se il file è quello corretto ed è stato trasferito correttamente.
Kiwy,

Risposte:


34

Utilizzando find:

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

Se stai cercando /, puoi escludere /proce /sysvedere il seguente findesempio di comando:

Inoltre ho fatto alcuni test, ho findimpiegato più tempo e meno CPU e RAM in cui lo script ruby ​​richiede meno tempo ma più CPU e RAM

Risultato del test

Trova

[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

Trova 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

Si desidera chiamare -prunesu /sys/ /procinvece di scendere in loro ed escludere i file con -path. Dovresti preferire !la -notportabilità.
Stéphane Chazelas,

Signore, ho aggiornato con -prune, una volta controlla se è OK.
Rahul Patil,

Anche tu vuoi escludere /devcertamente.
Simon Richter,

12

Soluzione di 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

Soluzione di Bash Script basata sulla probabilità che funziona più velocemente

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

Risultato del 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

quale consiglieresti?
Kiwy,

@Kiwy non lo consiglio, solo per fare pratica
Rahul Patil,

@Kiwy una volta guarda il risultato del test e fammi sapere e anche fare alcuni test dalla tua parte e mostrarci il risultato, sarebbe bello vedere il risultato su AIX. : D
Rahul Patil,

Il mio problema principale con il tuo script è che ha bisogno di ruby ​​e non è installato sul mio sistema e non sono amministratore. ma stasera farò dei test se trovo un po 'di tempo
Kiwy,

Sembra più veloce di trovare alla fine ^^. forse potresti mettere md5sum in un thread in modo da poter calcolare 5 md5sum allo stesso tempo, risparmiando anche un po 'di tempo
Kiwy,

7

Se decidi di installare gnu find (e poiché hai indicato interesse per uno dei tuoi commenti), puoi provare qualcosa del tipo:

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

e hai checkmd5confrontato il md5sum del file che ottiene come argomento confronta con il secondo argomento e stampa il nome se corrisponde e termina con 1 (invece di 0 altrimenti). Il -quitavranno findfermata una volta che è stato trovato.

checkmd5 (non testato):

#!/bin/bash

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

if [ $md == $2 ] ; then
  echo $1
  exit 1
fi
exit 0

Yum No package checkmd5 available, per favore includi per quale pacchetto deve essere installatocheckmd5
Rahul Patil

Mi piace troppo questa soluzione che non capisco checkmd5ma mi piace il modo in cui la fai
Kiwy

Script @kiwy aggiunto.
Anthon,

@RahulPatil è nella distribuzione fai-da-te ;-)
Anthon,

@kiwy Siamo spiacenti ma avrei potuto accettare la tua modifica -type f, ma ha annullato il mio che echo $1avevo già inserito
Anthon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.