Onun sağlama toplamı bildiğiniz bir dosyayı bulmak?


29

Ben md5sumbir dosyanın ve bu benim sistemde nerede olduğunu bilmiyorum. findBir dosyayı , kendisine göre tanımlamak için kolay bir seçenek var mı md5? Yoksa küçük bir senaryo geliştirmem gerekiyor mu?

GNU araçları olmadan AIX 6 üzerinde çalışıyorum.


4
Aramayı, aynı boyuttaki dosya boyutlarına daraltmak ve ardından md5'i hesaplamak daha hızlı olmaz mıydı?
RJ

@ RJ- evet belki ama bu durumda aynı zamanda dosyanın doğru olup olmadığını kontrol etmeme izin veriyor ve doğru şekilde aktarılmış.
Kiwy

Yanıtlar:


33

Kullanarak find:

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

Eğer araştırıyorsanız, aşağıdaki komut örneğini /hariç tutabilir /procve /sysgörebilirsiniz find:

Ayrıca bazı testler yapmıştım, finddaha fazla zaman harcadım ve daha az CPU ve RAM kullandı.

Test sonucu

bulmak

[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

İle bul -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

Aramak istediğiniz -pruneüzerinde /sys/ /procyerine onları inen ve dosyaları dışlamak -path. Sen tercih etmeliyiz !üzerinde -nottaşınabilirlik için.
Stéphane Chazelas

Efendim -prune ile güncelleme yaptım, bir kez sorun olup olmadığını kontrol edin.
Rahul Patil

Ayrıca /devkesinlikle dışlamak istersiniz .
Simon Richter

12

Script Çözümü

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

Daha hızlı çalışan olasılığı temel alan Bash Script çözümü

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

Test sonucu

[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

hangisini tavsiye edersin?
Kiwy

@Kiwy Tavsiye etmiyorum, Sadece pratik için
Rahul Patil

@Kiwy bir keresinde test sonucuna bakıp bana kendi tarafınızdan bazı testler yapıp, sonucu bize gösterip sonucu gösterir, AIX'te sonucu görmek harika olurdu. : D
Rahul Patil

Komut dosyanızla ilgili temel sorunum, yakut gerektirmesi ve Sistemime yüklenmemesi ve yönetici olmadığımdır. ama bu gece biraz test edeceğim, eğer biraz zaman
bulursam

Sonunda bulmaktan daha hızlı görünüyor ^^. Belki de bir
md5sum'u bir dizgeye

7

Yine de gnu bulmaya karar verirseniz (ve yorumlarınızdan birine ilgi gösterdiğinizden beri), şöyle bir şey deneyebilirsiniz:

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

ve checkmd5argüman olarak aldığı dosyanın md5sum'unu ikinci argümanla karşılaştırdığına göre karşılaştırıp, 1 ile eşleşip çıkıp (aksi takdirde 0 yerine) ismini yazdırabilirsiniz. -quitOlacak findo bulunduğunda durdurma.

checkmd5 (test edilmedi):

#!/bin/bash

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

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

Yum No package checkmd5 available, lütfen hangi paketin yüklenmesi gerektiğini de ekleyincheckmd5
Rahul Patil

Bu çözümü çok fena seviyorum checkmd5ama alamadım ama senin yapma şeklini seviyorum
Kiwy

@kiwy betiği eklendi.
Anthon

@RululPatil DIY dağıtımında ;-)
Anthon

@kiwy Üzgünüz, düzenlemenizi kabul etmiş olabilir -type f, ancak bu, echo $1önceden koyduğum silinmemiş şeydi
Anthon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.