Temukan file ketika Anda tahu checksumnya?

30

Saya memiliki md5sumfile dan saya tidak tahu di mana file itu berada di sistem saya. Apakah ada opsi mudah finduntuk mengidentifikasi file berdasarkan pada file itu md5? Atau apakah saya perlu membuat skrip kecil?

Saya sedang mengerjakan AIX 6 tanpa alat GNU.

Kiwy
sumber
4
Bukankah mempersempit pencarian ke ukuran file dengan ukuran yang sama kemudian menghitung md5 menjadi lebih cepat?
RJ-
@ RJ- ya mungkin tetapi dalam kasus ini juga memungkinkan saya untuk memeriksa apakah file itu benar dan telah ditransfer dengan benar.
Kiwy

Jawaban:

34

Menggunakan find:

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

Jika Anda mencari melalui /maka Anda dapat mengecualikan /procdan /sysmelihat findcontoh perintah berikut :

Juga saya telah melakukan beberapa pengujian, findmembutuhkan lebih banyak waktu dan lebih sedikit CPU dan RAM di mana skrip ruby ​​mengambil lebih sedikit waktu tetapi lebih banyak CPU dan RAM

Hasil tes

Menemukan

[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

Temukan dengan -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

Script Ruby

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

real    1m3.065s
user    0m2.231s
sys     0m20.706s
Rahul Patil
sumber
Anda ingin menelepon -prunepada /sys/ /procbukannya turun di dalamnya dan belum termasuk file dengan -path. Anda harus memilih !lebih dari -notportabilitas.
Stéphane Chazelas
Pak, saya telah memperbarui dengan -prune, sekali periksa apakah itu OK.
Rahul Patil
Anda juga ingin mengecualikan /devtentu saja.
Simon Richter
12

Solusi Skrip

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

Solusi Bash Script berdasarkan probabilitas yang bekerja lebih cepat

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

Hasil tes

[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
sumber
mana yang akan kamu rekomendasikan?
Kiwy
@ Kiwy Saya tidak merekomendasikan, Hanya untuk latihan
Rahul Patil
@ Kyiwy sekali melihat hasil tes dan beri tahu saya dan juga melakukan beberapa pengujian dari sisi Anda dan tunjukkan hasilnya kepada kami, alangkah baiknya melihat hasilnya di AIX. : D
Rahul Patil
Masalah utama saya dengan skrip Anda adalah bahwa ia memerlukan ruby ​​dan tidak diinstal pada Sistem saya, dan saya bukan admin. tapi saya akan menjalankan beberapa tes malam ini jika saya menemukan waktu
Kiwy
Tampaknya lebih cepat daripada menemukan pada akhirnya ^^. mungkin Anda bisa meletakkan md5sum di utas sehingga Anda dapat menghitung 5 md5sum pada saat yang sama dapat menghemat sedikit waktu
Kiwy
7

Jika Anda tetap memutuskan untuk menginstal gnu find (dan karena Anda menunjukkan minat pada salah satu komentar Anda), Anda dapat mencoba sesuatu seperti:

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

dan telah checkmd5membandingkan md5sum dari file yang didapat sebagai argumen dibandingkan dengan argumen kedua dan mencetak nama jika cocok dan keluar dengan 1 (bukan 0 sebaliknya). The -quitakan memiliki findberhenti setelah ditemukan.

checkmd5 (tidak diuji):

#!/bin/bash

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

if [ $md == $2 ] ; then
  echo $1
  exit 1
fi
exit 0
Anthon
sumber
Yum No package checkmd5 available, harap sertakan paket mana yang perlu diinstal untukcheckmd5
Rahul Patil
Saya suka solusi ini terlalu buruk, saya tidak mengerti checkmd5tetapi saya suka cara Anda melakukannya
Kiwy
Skrip @kiwy ditambahkan.
Anthon
@RahulPatil ada di distribusi DIY ;-)
Anthon
@kiwy Maaf bisa menerima suntingan Anda -type f, tetapi itu dihapus saya echo $1sudah dimasukkan
Anthon