在知道文件校验和后找到文件?


29

我有md5sum一个文件,我不知道它在系统上的位置。是否有find基于文件识别文件的简单选择md5?还是我需要开发一个小脚本?

我正在使用没有GNU工具的AIX 6。


4
不会将搜索范围缩小到相同大小的文件,然后计算md5更快吗?
RJ-

@ RJ-是的,但是在这种情况下,它还允许我检查文件是否正确以及是否已正确传输。
2014年

Answers:


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

Ruby脚本

[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便携性。
斯特凡Chazelas

先生,我已经使用-prune更新了,请检查一下是否还可以。
Rahul Patil 2014年

您也/dev肯定要排除在外。
Simon Richter 2014年

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脚本解决方案运行速度更快

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

您会推荐哪个?
2014年

@Kiwy我不推荐,只是为了练习
Rahul Patil

@Kiwy曾经查看测试结果,并让我知道了,并从您身边进行了一些测试并将结果展示给我们,非常高兴在AIX上看到结果。:D
Rahul Patil 2014年

我的脚本主要问题是它需要ruby,并且未安装在我的系统上,并且不是管理员。但是如果有时间我会在今晚进行一些测试
Kiwy 2014年

看来比最后找到^^要快。也许您可以将md5sum放在一个线程中,以便可以同时计算5 md5sum,这样也可以节省一些时间
Kiwy 2014年

7

如果您仍然决定安装gnu find(并且由于您对其中一项评论表示有兴趣),则可以尝试以下操作:

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
Rahul Patil 2014年

我太喜欢这个解决方案了,我不明白,checkmd5但我喜欢您的解决方法
Kiwy

添加了@kiwy脚本。
Anthon 2014年

@RahulPatil,它在DIY分发中;-)
Anthon

@kiwy Sorry本来可以接受您的编辑-type f,但是撤消了echo $1我已经输入的内容
Anthon 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.