ค้นหาไฟล์เมื่อคุณรู้จักการตรวจสอบมัน?


29

ฉันมีmd5sumไฟล์และฉันไม่รู้ว่ามันอยู่ที่ไหนในระบบของฉัน มีตัวเลือกง่าย ๆ ในfindการระบุไฟล์ตามmd5หรือไม่? หรือฉันจำเป็นต้องพัฒนาสคริปต์ขนาดเล็ก?

ฉันทำงานบน AIX 6 โดยไม่มีเครื่องมือ GNU


4
จะไม่ทำการลดขนาดการค้นหาไฟล์ที่มีขนาดเท่ากันแล้วคำนวณ md5 ให้เร็วขึ้นไหม
RJ-

@ RJ- ใช่ แต่ในกรณีนี้มันอนุญาตให้ฉันตรวจสอบว่าไฟล์นั้นถูกต้องหรือไม่และถ่ายโอนอย่างถูกต้อง
Kiwy

คำตอบ:


33

การใช้find:

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

หากคุณค้นหา/คุณสามารถยกเว้น/procและ/sysดูfindตัวอย่างคำสั่งต่อไปนี้:

นอกจากนี้ฉันได้ทำการทดสอบfindใช้เวลามากขึ้นและใช้ CPU และ RAM น้อยลงซึ่งสคริปต์ ruby ​​ใช้เวลาน้อยลง แต่มี CPU และ RAM เพิ่มขึ้น

ผลการทดสอบ

หา

[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สำหรับการพกพา
Stéphane Chazelas

คุณฉันได้อัพเดทด้วย -prune เมื่อตรวจสอบว่ามันใช้ได้
ราหุลปาติล

คุณยังต้องการที่จะยกเว้น/devอย่างแน่นอน
Simon Richter

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

วิธีการแก้ปัญหา Bash Script ขึ้นอยู่กับความน่าจะเป็นที่ทำงานได้เร็วขึ้น

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

คุณอยากแนะนำอะไร
Kiwy

@ กีวี่ฉันไม่แนะนำเพียงเพื่อการปฏิบัติงาน
Rahul Patil

@Kiwy ครั้งเดียวดูผลการทดสอบและแจ้งให้เราทราบและทำการทดสอบจากด้านข้างของคุณและแสดงให้เราเห็นผลมันจะดีมากที่จะเห็นผลใน AIX : D
Rahul Patil

ปัญหาหลักของฉันกับสคริปต์ของคุณคือต้องใช้ทับทิมและไม่ได้ติดตั้งในระบบของฉันและฉันไม่ใช่ผู้ดูแลระบบ แต่ฉันจะทำการทดสอบคืนนี้ถ้าฉันหาเวลา
Kiwy

ดูเหมือนจะเร็วกว่าที่พบในตอนท้าย ^^ บางทีคุณสามารถใส่ md5sum ในเธรดเพื่อให้คุณสามารถคำนวณ 5 md5sum ในเวลาเดียวกันมันสามารถประหยัดเวลาได้อีกด้วย
Kiwy

7

หากคุณตัดสินใจที่จะติดตั้ง gnu ให้ค้นหา (และเนื่องจากคุณระบุความสนใจในความคิดเห็นของคุณ) คุณสามารถลองทำสิ่งต่อไปนี้:

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

เพิ่มสคริปต์ @kiwy แล้ว
Anthon

@RahulPatil อยู่ในการกระจายแบบ DIY ;-)
Anthon

@kiwy ขออภัยสามารถยอมรับการแก้ไขของคุณ-type fได้ แต่มันยกเลิกการลบของecho $1ฉันที่ฉันได้ใส่ไว้แล้ว
Anthon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.