チェックサムがわかっているときにファイルを見つけますか?


29

私が持っているmd5sumファイルのを、それは私のシステム上にある場合、私は知りません。にfind基づいてファイルを識別する簡単なオプションはありますmd5か?または、小さなスクリプトを開発する必要がありますか?

GNUツールなしでAIX 6に取り組んでいます。


4
同じサイズのファイルサイズに検索を絞り込んでから、md5の計算を高速化しませんか?
RJ-

@ RJ-はい、しかしこの場合、ファイルが正しいものであり、正しく転送されているかどうかを確認することもできます。
キウィ14年

回答:


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
ステファンシャゼル14年

私は-pruneで更新しました。一度問題ないか確認してください。
ラーフルパティル14年

また、/dev確実に除外する必要があります。
サイモンリヒター14年

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

どちらをお勧めしますか?
Kiwy 14年

@Kiwy私はちょうど練習のために、お勧めしていないよ
ラーフルパティル

@Kiwyは一度テスト結果を見て、あなたの側からいくつかのテストを行い、その結果を見せてくれます。AIXで結果を見るのは素晴らしいことです。:D
ラフルパティル14年

あなたのスクリプトに関する私の主な問題は、それがルビーを必要とし、それが私のシステムにインストールされておらず、私が管理者ではないということです。時間があれば、今夜いくつかのテストを実行します
Kiwy 14年

最後に見つけるよりも速いようです^^。あなたは、それはまた少し時間を節約することができ、同時に5にmd5sumを計算することができますので、多分あなたは、スレッドでのmd5sumを入れることができます
Kiwy

7

とにかくgnu findをインストールすることにした場合(そして、コメントの1つに興味を示したので)、次のようなものを試すことができます。

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

そして、しているcheckmd5引数が第二引数に比較して、それが(それ以外の場合は0ではなく)1と一致して終了した場合に名前を印刷してそれを取得ファイルのmd5sumの比較。-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
ラーフルパティル

Iあまりにも悪い私は得ることはありません。このソリューションのようにcheckmd5あなたがそれを行う方法のように、私
Kiwy

@kiwyスクリプトが追加されました。
アントン14年

それは;-) DIY分布である@RahulPatil
Anthonの

申し訳ありません@kiwyはあなたのために編集を受け入れている可能性-type fが、それは私の未削除echo $1私はすでにに入れていた
Anthonの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.