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.