Intereting Posts
AWK / Работа со строками: как извлечь строки из столбца и сравнить его с числом перед печатью Выполнить команду один раз на строку ввода в виде канала? Выключить экран, когда он неактивен для периода времени в RHEL и Debian Сценарий Bash: команда ls не найдена Исключение модулей ядра через /etc/modprobe.d/blacklist.conf не работает sfdisk – «Этот диск в настоящее время используется» – но, похоже, ничто его не использует? Как скопировать файлы из локального центра обработки данных в локальный центр обработки данных и иметь некоторые отказоустойчивые случаи? Какой код запускается, когда я набираю «sudo service nginx start» Какие пакеты установлены по умолчанию в Debian? Есть ли термин для этого набора? Почему некоторые из этих пакетов «автоматически установлены», а некоторые нет? Широковещательный порт для других компьютеров после обратного туннелирования SSH Как настроить mutt для отображения заголовка даты в моем локальном часовом поясе в пейджере? Получите все регулярные выражения между двумя шаблонами и напечатайте их в файл fetchmail без mda Альтернатива RPM для dpkg-divert Может ли GPM использоваться в эмуляторе?

Найти файл, когда вы знаете его контрольную сумму?

У меня есть md5sum файла, и я не знаю, где он находится в моей системе. Есть ли простой способ find для идентификации файла на основе его md5 ? Или мне нужно разработать небольшой скрипт?

Я работаю над AIX 6 без инструментов GNU.

Использование 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 

Рубиновый скрипт

 [root@dc1 ~]# time ruby findm.rb File Found at: /tmp/file1 real 1m3.065s user 0m2.231s sys 0m20.706s 

Сценарий

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

Если вы решите установить gnu find anyway (и поскольку вы указали интерес к одному из своих комментариев), вы можете попробовать что-то вроде:

 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