Самый быстрый способ узнать, являются ли два файла одинаковыми в Unix/Linux?



у меня есть сценарий оболочки, в котором мне нужно проверить, являются ли два файла одинаковыми или нет. Я делаю это для большого количества файлов, и в моем скрипте diff команда, похоже, является узким местом производительности.



вот строчка:



diff -q $dst $new > /dev/null

if ($status) then ...


может ли быть более быстрый способ сравнить файлы, возможно, пользовательский алгоритм вместо стандартного diff?

579   5  

5 ответов:

Я считаю cmp остановится на первой разнице байтов:

cmp --silent $old $new || echo "files are different"

Мне нравится @Alex Howansky использовали 'cmp -- silent' для этого. Но мне нужен как положительный, так и отрицательный ответ, поэтому я использую:

cmp --silent file1 file2 && echo '### SUCCESS: Files Are Identical! ###' || echo '### WARNING: Files Are Different! ###'

затем я могу запустить это в терминале или с ssh, чтобы проверить файлы против постоянного файла.

почему бы вам не получить хэш содержимого обоих файлов?

попробуйте этот скрипт, назовите его например script.sh а затем запустите его следующим образом: script.sh file1.текстовый файл2.txt

#!/bin/bash

file1=`md5 `
file2=`md5 `

if [ "$file1" = "$file2" ]
then
    echo "Files have the same content"
else
    echo "Files have NOT the same content"
fi

для файлов, которые не отличаются, любой метод потребует чтения обоих файлов полностью, даже если чтение было в прошлом.

альтернативы нет. Поэтому создание хэшей или контрольных сумм в какой-то момент времени требует чтения всего файла. Большие файлы требуют времени.

получение метаданных файла намного быстрее, чем чтение большого файла.

Итак, есть ли какие-либо метаданные файлов, которые вы можете использовать, чтобы установить, что файлы отличаются? Размер файла ? или даже результаты команды file, которая только что прочитала небольшую часть файла?

размер файла пример фрагмента кода:

  ls -l   | 
  awk 'NR==1{a=} NR==2{b=} 
       END{val=(a==b)?0 :1; exit( val) }'

[ $? -eq 0 ] && echo 'same' || echo 'different'  

если файлы имеют одинаковый размер, то вы застряли с полным читает файл.

попробуйте также использовать команду cksum:

chk1=`cksum <file1> | awk -F" " '{print }'`
chk2=`cksum <file2> | awk -F" " '{print }'`

if [ $chk1 -eq $chk2 ]
then
  echo "File is identical"
else
  echo "File is not identical"
fi

команда cksum выведет количество байтов файла. См. "man cksum".

Comments

    Ничего не найдено.