जब आप इसका चेकसम जानते हैं, तो एक फ़ाइल ढूँढें?


29

मेरे पास md5sumएक फ़ाइल है और मुझे नहीं पता कि यह मेरे सिस्टम में कहां है। क्या किसी findफ़ाइल को उसके आधार पर पहचानने का कोई आसान विकल्प है md5? या क्या मुझे एक छोटी स्क्रिप्ट विकसित करने की आवश्यकता है?

मैं GNU टूल्स के बिना AIX 6 पर काम कर रहा हूं।


4
खोज को एक ही आकार के फ़ाइल आकार में संकुचित नहीं करना है तो md5 की गणना करना अधिक तेज़ होगा?
आरजे-

@ आरजे- हां हो सकता है लेकिन इस मामले में यह मुझे जांचने की भी अनुमति देता है कि क्या फाइल सही है और सही तरीके से ट्रांसफर की गई है।
कीवी

जवाबों:


33

का उपयोग कर find:

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

यदि आप के माध्यम से खोज कर रहे हैं, /तो आप बाहर कर सकते हैं /procऔर /sysनिम्नलिखित findउदाहरण देख सकते हैं :

इसके अलावा मैंने कुछ परीक्षण किए थे, findअधिक समय और कम सीपीयू और रैम लें जहां रूबी स्क्रिप्ट कम समय ले रही है लेकिन अधिक सीपीयू और रैम

परीक्षा परिणाम

खोज

[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

के साथ खोजें -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

रूबी स्क्रिप्ट

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

real    1m3.065s
user    0m2.231s
sys     0m20.706s

आप उनमें से उतरने के बजाय / -pruneपर कॉल करना चाहते हैं और फ़ाइलों को बाहर करना चाहते हैं । आपको पोर्टेबिलिटी के लिए ओवर पसंद करना चाहिए । /sys/proc-path!-not
स्टीफन चेजालस

सर मैंने -प्र्यून के साथ अपडेट किया है, एक बार जांच लें कि क्या यह ठीक है।
राहुल पाटिल

आप /devनिश्चित रूप से बाहर करना चाहते हैं ।
साइमन रिक्टर

12

स्क्रिप्ट समाधान

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

संभावना के आधार पर बैश स्क्रिप्ट समाधान जो तेजी से काम करता है

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

परीक्षा परिणाम

[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

आप किसकी सिफारिश करेंगे?
कीवी

@ कीवी मैं सिफारिश नहीं कर रहा हूं, सिर्फ अभ्यास के लिए
राहुल पाटिल

@ कीवी एक बार परीक्षा परिणाम को देखें और मुझे बताएं और अपनी तरफ से कुछ परीक्षण भी करें और हमें परिणाम दिखाएं, यह AIX पर परिणाम देखने के लिए बहुत अच्छा होगा। : D
राहुल पाटिल

आपकी स्क्रिप्ट के साथ मेरा मुख्य मुद्दा यह है कि इसे माणिक की आवश्यकता है और यह मेरे सिस्टम पर स्थापित नहीं है, और मैं व्यवस्थापक नहीं हूं। लेकिन मैं आज रात कुछ परीक्षण चलाऊंगा अगर मुझे कुछ समय मिल जाए
किवी

यह अंत में खोजने की तुलना में तेज लगता है ^ ^। शायद आप md5sum को एक धागे में रख सकते हैं ताकि आप 5 md5sum की गणना कर सकें, साथ ही यह थोड़ा सा समय भी बचा सके
किवी

7

यदि आप किसी भी तरह से गन्नू स्थापित करने का निर्णय लेते हैं (और जब से आपने अपनी किसी टिप्पणी में रुचि दिखाई है), आप कुछ इस तरह की कोशिश कर सकते हैं:

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

और checkmd5फ़ाइल के md5sum की तुलना करें, इसे तर्क के रूप में दूसरे तर्क की तुलना में मिलता है और यदि यह 1 से मेल खाता है और बाहर निकलता है (तो 0 के बजाय)। -quitहोगा findएक बार यह पाया जाता है रोक।

checkmd5 (टेस्ट नहीं हुआ):

#!/bin/bash

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

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

यम No package checkmd5 available, कृपया शामिल करें कि किस पैकेज के लिए स्थापित करने की आवश्यकता हैcheckmd5
राहुल पाटिल

मुझे यह सॉल्यूशन बहुत बुरा लगता है जो मुझे नहीं मिलता है checkmd5लेकिन मुझे यह करने का तरीका पसंद है
किवी

@kiwy स्क्रिप्ट गयी।
एंथन

@RahulPatil यह DIY डिस्ट्रीब्यूशन में है ;-)
एंथन

@kiwy क्षमा करें -type f, आपके संपादन को स्वीकार किया जा सकता है , लेकिन इसने मेरे द्वारा echo $1पहले से ही डाला गया
एंथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.