ฉันมีmd5sum
ไฟล์และฉันไม่รู้ว่ามันอยู่ที่ไหนในระบบของฉัน มีตัวเลือกง่าย ๆ ในfind
การระบุไฟล์ตามmd5
หรือไม่? หรือฉันจำเป็นต้องพัฒนาสคริปต์ขนาดเล็ก?
ฉันทำงานบน AIX 6 โดยไม่มีเครื่องมือ GNU
ฉันมีmd5sum
ไฟล์และฉันไม่รู้ว่ามันอยู่ที่ไหนในระบบของฉัน มีตัวเลือกง่าย ๆ ในfind
การระบุไฟล์ตามmd5
หรือไม่? หรือฉันจำเป็นต้องพัฒนาสคริปต์ขนาดเล็ก?
ฉันทำงานบน AIX 6 โดยไม่มีเครื่องมือ GNU
คำตอบ:
การใช้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
สำหรับการพกพา
/dev
อย่างแน่นอน
โซลูชันสคริปต์
#!/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
หากคุณตัดสินใจที่จะติดตั้ง 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
แต่ฉันชอบวิธีที่คุณทำ
-type f
ได้ แต่มันยกเลิกการลบของecho $1
ฉันที่ฉันได้ใส่ไว้แล้ว