Mam md5sumplik i nie wiem, gdzie on jest w moim systemie. Czy jest jakaś łatwa opcja findidentyfikacji pliku na podstawie jego pliku md5? Czy muszę opracować mały skrypt?
Jeśli przeszukujesz /, możesz wykluczyć /proci /syszobaczyć następujący findprzykład polecenia:
Przeprowadziłem też testy, findpoświęciłem więcej czasu i mniej procesora i pamięci RAM, gdzie skrypt ruby zajmuje mniej czasu, ale więcej procesora i pamięci RAM
Wynik testu
Odnaleźć
[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
Znajdź za pomocą -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
Skrypt Ruby
[root@dc1 ~]# time ruby findm.rb
File Found at: /tmp/file1
real 1m3.065s
user 0m2.231s
sys 0m20.706s
Chcesz zadzwonić -prunena /sys/ /proczamiast malejącej w nich i nie pliki -path. Należy wolisz !nad -notdla przenośności.
Stéphane Chazelas
Sir, zaktualizowałem za pomocą -prune, raz sprawdź, czy jest w porządku.
Rahul Patil
/devZ pewnością chcesz również wykluczyć .
Simon Richter
12
Rozwiązanie skryptu
#!/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
Rozwiązanie Bash Script oparte na prawdopodobieństwie, które działa szybciej
[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 kiedyś spojrzał na wynik testu i dał mi znać, a także wykonał kilka testów z twojej strony i pokazał nam wynik. Byłoby wspaniale zobaczyć wynik w systemie AIX. : D
Rahul Patil
Moim głównym problemem ze skryptem jest to, że potrzebuje ruby i nie jest zainstalowany w moim systemie, a ja nie jestem administratorem. ale przeprowadzę dzisiaj test, jeśli znajdę trochę czasu
Kiwy
Wydaje się szybszy niż na końcu ^^. może mógłbyś umieścić md5sum w wątku, abyś mógł obliczyć 5 md5sum w tym samym czasie, co mogłoby zaoszczędzić trochę czasu
Kiwy
7
Jeśli mimo to zdecydujesz się zainstalować GNU Find (a ponieważ wyraziłeś zainteresowanie jednym z komentarzy), możesz spróbować czegoś takiego:
i checkmd5porównajmy sumę md5 pliku, który dostaje jako argument, porównaj z drugim argumentem i wypisz nazwę, jeśli pasuje, i wyjdź z 1 (zamiast 0 w przeciwnym razie). Po zatrzymaniu przestaną -quitdziałać find.
checkmd5 (nie testowany):
#!/bin/bash
md=$(md5sum $1 | cut -d' ' -f1)
if [ $md == $2 ] ; then
echo $1
exit 1
fi
exit 0
Odpowiedzi:
Używanie
find
:Jeśli przeszukujesz
/
, możesz wykluczyć/proc
i/sys
zobaczyć następującyfind
przykład polecenia:Przeprowadziłem też testy,
find
poświęciłem więcej czasu i mniej procesora i pamięci RAM, gdzie skrypt ruby zajmuje mniej czasu, ale więcej procesora i pamięci RAMWynik testu
Odnaleźć
Znajdź za pomocą
-prune
Skrypt Ruby
źródło
-prune
na/sys
//proc
zamiast malejącej w nich i nie pliki-path
. Należy wolisz!
nad-not
dla przenośności./dev
Z pewnością chcesz również wykluczyć .Rozwiązanie skryptu
Rozwiązanie Bash Script oparte na prawdopodobieństwie, które działa szybciej
Wynik testu
źródło
Jeśli mimo to zdecydujesz się zainstalować GNU Find (a ponieważ wyraziłeś zainteresowanie jednym z komentarzy), możesz spróbować czegoś takiego:
i
checkmd5
porównajmy sumę md5 pliku, który dostaje jako argument, porównaj z drugim argumentem i wypisz nazwę, jeśli pasuje, i wyjdź z 1 (zamiast 0 w przeciwnym razie). Po zatrzymaniu przestaną-quit
działaćfind
.checkmd5
(nie testowany):źródło
No package checkmd5 available
, proszę podać, który pakiet należy zainstalowaćcheckmd5
checkmd5
ale podoba mi się sposób, w jaki to robisz-type f
, ale cofnęło to moje,echo $1
które już wstawiłem