Znajdź plik, gdy znasz jego sumę kontrolną?

29

Mam md5sumplik i nie wiem, gdzie on jest w moim systemie. Czy jest jakaś łatwa opcja findidentyfikacji pliku na podstawie jego pliku md5? Czy muszę opracować mały skrypt?

Pracuję na systemie AIX 6 bez narzędzi GNU.

Kiwy
źródło
4
Czy zawężenie wyszukiwania do rozmiarów plików o tym samym rozmiarze nie byłoby szybsze?
RJ-
@ RJ - może tak, ale w tym przypadku pozwala mi również sprawdzić, czy plik jest prawidłowy i czy został poprawnie przesłany.
Kiwy

Odpowiedzi:

33

Używanie find:

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

Jeśli przeszukujesz /, możesz wykluczyć /proci /syszobaczyć następujący findprzykład polecenia:

Przeprowadziłem też testy, findpoświęciłem więcej czasu i mniej procesora i pamięci RAM, gdzie skrypt ruby ​​zajmuje mniej czasu, ale więcej procesora i pamięci RAM

Wynik testu

Odnaleźć

[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

Znajdź za pomocą -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

Skrypt Ruby

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

real    1m3.065s
user    0m2.231s
sys     0m20.706s
Rahul Patil
źródło
Chcesz zadzwonić -prunena /sys/ /proczamiast malejącej w nich i nie pliki -path. Należy wolisz !nad -notdla przenośności.
Stéphane Chazelas
Sir, zaktualizowałem za pomocą -prune, raz sprawdź, czy jest w porządku.
Rahul Patil
/devZ pewnością chcesz również wykluczyć .
Simon Richter
12

Rozwiązanie skryptu

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

Rozwiązanie Bash Script oparte na prawdopodobieństwie, które działa szybciej

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

Wynik testu

[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
źródło
co byś polecił
Kiwy
@Kiwy Nie polecam, tylko do ćwiczeń
Rahul Patil
@Kiwy kiedyś spojrzał na wynik testu i dał mi znać, a także wykonał kilka testów z twojej strony i pokazał nam wynik. Byłoby wspaniale zobaczyć wynik w systemie AIX. : D
Rahul Patil
Moim głównym problemem ze skryptem jest to, że potrzebuje ruby ​​i nie jest zainstalowany w moim systemie, a ja nie jestem administratorem. ale przeprowadzę dzisiaj test, jeśli znajdę trochę czasu
Kiwy
Wydaje się szybszy niż na końcu ^^. może mógłbyś umieścić md5sum w wątku, abyś mógł obliczyć 5 md5sum w tym samym czasie, co mogłoby zaoszczędzić trochę czasu
Kiwy
7

Jeśli mimo to zdecydujesz się zainstalować GNU Find (a ponieważ wyraziłeś zainteresowanie jednym z komentarzy), możesz spróbować czegoś takiego:

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

i checkmd5porównajmy sumę md5 pliku, który dostaje jako argument, porównaj z drugim argumentem i wypisz nazwę, jeśli pasuje, i wyjdź z 1 (zamiast 0 w przeciwnym razie). Po zatrzymaniu przestaną -quitdziałać find.

checkmd5 (nie testowany):

#!/bin/bash

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

if [ $md == $2 ] ; then
  echo $1
  exit 1
fi
exit 0
Anthon
źródło
Mniam No package checkmd5 available, proszę podać, który pakiet należy zainstalowaćcheckmd5
Rahul Patil
Bardzo podoba mi się to rozwiązanie, nie rozumiem, checkmd5ale podoba mi się sposób, w jaki to robisz
Kiwy
Dodano skrypt @kiwy.
Anthon
@RahulPatil jest w dystrybucji DIY ;-)
Anthon
@kiwy Przepraszamy, mogłem zaakceptować Twoją zmianę -type f, ale cofnęło to moje, echo $1które już wstawiłem
Anthon