체크섬을 알고있을 때 파일을 찾으십니까?


29

나는이 md5sum파일의를하고 내 시스템에 어디 있는지 모르겠어. find파일을 기반으로 파일을 식별하는 쉬운 옵션이 md5있습니까? 아니면 작은 스크립트를 개발해야합니까?

GNU 도구없이 AIX 6에서 작업하고 있습니다.


4
같은 크기의 파일 크기로 검색 범위를 좁히지 않고 md5 계산 속도가 더 빠를까요?
RJ-

@ RJ- 네. 어쩌면이 경우 파일이 올바른지, 올바르게 전송되었는지 확인할 수 있습니다.
Kiwy

답변:


33

사용 find:

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

검색 /하면 다음 명령 예제를 제외 /proc하고 /sys볼 수 있습니다 find.

또한 몇 가지 테스트를 수행 find했으며 루비 스크립트가 시간이 덜 걸리지 만 CPU와 RAM이 더 많은 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으로 업데이트했습니다. 한 번 확인하십시오.
Rahul Patil

또한 /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

@Kiwy 나는 권장하지 않습니다, 단지 연습을 위해
Rahul Patil

@Kiwy는 테스트 결과를 한 번보고 나에게 테스트하고 알려주며 결과를 보여줍니다. AIX에서 결과를 보는 것이 좋습니다. : D
Rahul Patil

스크립트의 주요 문제는 루비가 필요하고 시스템에 설치되어 있지 않으며 관리자가 아니라는 것입니다. 하지만 시간이 있으면 오늘 밤 테스트를해볼 게요
Kiwy

결국 찾기보다 빠르다 ^^. 아마 당신은 스레드에 md5sum을 넣을 수 있습니다. 그래서 당신은 또한 약간의 시간을 절약 할 수있는 동시에 5 md5sum을 계산할 수 있습니다
Kiwy

7

어쨌든 gnu find를 설치하기로 결정했다면 (그리고 귀하의 의견 중 하나에 관심을 보이므로) 다음과 같이 시도해보십시오.

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

그리고 checkmd5인수로 얻는 파일의 md5sum을 두 번째 인수와 비교하고 이름이 일치하면 이름을 인쇄하고 1로 종료하십시오 (그렇지 않으면 0 대신). 는 -quitfind이 발견되면 정지합니다.

checkmd5 (검증되지 않은):

#!/bin/bash

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

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

Yum 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.