যখন আপনি একটি ফাইল চেকসাম জানেন তখন সন্ধান করবেন?


29

আমার কাছে md5sumএকটি ফাইল রয়েছে এবং আমি জানি না এটি আমার সিস্টেমে কোথায় রয়েছে। এর findউপর ভিত্তি করে কোনও ফাইল সনাক্ত করার কোনও সহজ বিকল্প নেই md5? নাকি আমার একটি ছোট স্ক্রিপ্ট বিকাশ করা দরকার?

আমি জিএনইউ সরঞ্জামগুলি ছাড়াই এআইএক্স 6 এ কাজ করছি।


4
এমডি 5 দ্রুত করা কম্পিউটারের একই আকারের ফাইলগুলিতে অনুসন্ধান সংকীর্ণ করবেন না?
আরজে-

@ আরজে- হ্যাঁ তবে এই ক্ষেত্রে এটি আমাকে ফাইলটি সঠিক কিনা এবং সঠিকভাবে স্থানান্তরিত হয়েছে কিনা তাও পরীক্ষা করে দেখতে দেয় check
কিউই

উত্তর:


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

আপনি কোনটি সুপারিশ করবেন?
কিউই

@ কিউই আমি কেবল অনুশীলনের জন্য সুপারিশ করছি না
রাহুল পাতিল

@ কিউই একবার পরীক্ষার ফলাফল দেখুন এবং আমাকে জানান এবং আপনার পক্ষ থেকে কিছু পরীক্ষাও করে দিন এবং ফলাফলটি আমাদের দেখান, এআইএক্স-এ ফলাফলটি দেখতে পারা দুর্দান্ত লাগবে। : ডি
রাহুল পাতিল

আপনার স্ক্রিপ্টের সাথে আমার প্রধান সমস্যাটি হ'ল এটির রুবি দরকার এবং এটি আমার সিস্টেমে ইনস্টল করা হয়নি, এবং আমি প্রশাসক নই। তবে কিছু সময়
পেলে

এটি শেষের চেয়ে বেশি দ্রুত বলে মনে হচ্ছে ^^ আপনি
এমডি 5সামকে

7

যদি আপনি gnu ইনস্টল করার সিদ্ধান্ত নেন তবে যাইহোক (এবং যেহেতু আপনি আপনার কোনও মন্তব্যে আগ্রহের ইঙ্গিত দিয়েছেন), আপনি এর মতো কিছু চেষ্টা করতে পারেন:

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

এবং checkmd5ফাইলটির এমডি 5সামটি এটি যুক্তির হিসাবে দ্বিতীয় আর্গুমেন্টের সাথে তুলনা করুন এবং এটি মেলে যদি নামটি মুদ্রণ করুন এবং 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 লিপি যুক্ত করা হয়েছে।
অ্যান্থন

@ রাহুলপাতিল এটি ডিআইওয়াই বিতরণে রয়েছে ;-)
অ্যান্থন

@কিওয়াই দুঃখিত -type f, আপনার সম্পাদনাটি গ্রহণ করতে পারতেন , তবে এটি আমার echo $1ইতিমধ্যে রেখে দিয়েছিল
আনথন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.