Encontre um arquivo quando souber sua soma de verificação?
30
Eu tenho o md5sumarquivo e não sei onde ele está no meu sistema. Existe alguma opção fácil de findidentificar um arquivo com base nele md5? Ou preciso desenvolver um pequeno script?
Estou trabalhando no AIX 6 sem as ferramentas GNU.
Você deseja chamar / -pruneem vez de descer neles e excluir arquivos com . Você deve preferir a portabilidade. /sys/proc-path!-not
Stéphane Chazelas
Senhor, eu atualizei com -prune, uma vez verifique se está OK.
Rahul Patil
Você também deseja excluir com /devcerteza.
Simon Richter
12
Solução de Script
#!/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
Solução Bash Script com base na probabilidade que funciona mais rapidamente
[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
O @Kiwy olhou uma vez para o resultado do teste e me avise e também faça alguns testes do seu lado e nos mostre o resultado. Seria ótimo ver o resultado no AIX. : D
Rahul Patil
Meu principal problema com o seu script é que ele precisa de ruby e não está instalado no meu sistema, e eu não sou administrador. mas eu vou correr alguns testes esta noite se eu encontrar algum tempo
kiwy
Parece mais rápido do que encontrar no final ^^. talvez você poderia colocar o md5sum em um segmento para que possa calcular 5 md5sum, ao mesmo tempo que poderia salvar também um pouco de tempo
kiwy
7
Se você decidir instalar o gnu find de qualquer maneira (e como você indicou interesse em um de seus comentários), tente algo como:
e checkmd5compare o md5sum do arquivo que ele obtém como argumento, compare com o segundo argumento e imprima o nome se ele corresponder e saia com 1 (em vez de 0 caso contrário). O -quitirá findparar quando for encontrado.
checkmd5 (não testado):
#!/bin/bash
md=$(md5sum $1 | cut -d' ' -f1)
if [ $md == $2 ] ; then
echo $1
exit 1
fi
exit 0
Respostas:
Usando
find
:Se você pesquisar
/
, poderá excluir/proc
e/sys
ver o seguintefind
exemplo de comando:Também fiz alguns testes,
find
levei mais tempo e menos CPU e RAM, onde o script ruby está demorando menos, mas mais CPU e RAMResultado do teste
Encontrar
Localizar com
-prune
Script Ruby
fonte
-prune
em vez de descer neles e excluir arquivos com . Você deve preferir a portabilidade./sys
/proc
-path
!
-not
/dev
certeza.Solução de Script
Solução Bash Script com base na probabilidade que funciona mais rapidamente
Resultado do teste
fonte
Se você decidir instalar o gnu find de qualquer maneira (e como você indicou interesse em um de seus comentários), tente algo como:
e
checkmd5
compare o md5sum do arquivo que ele obtém como argumento, compare com o segundo argumento e imprima o nome se ele corresponder e saia com 1 (em vez de 0 caso contrário). O-quit
iráfind
parar quando for encontrado.checkmd5
(não testado):fonte
No package checkmd5 available
, por favor inclua o qual necessidade pacote a ser instalados paracheckmd5
checkmd5
, mas eu gosto da maneira como você fazê-lo-type f
, mas não eliminado minhaecho $1
Eu já tinha colocado em