kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 JDS
JDS
Вопрос

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

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

Вот строка:

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

if ($status) then ...

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

201 2012-10-15T17:06:13+00:00 7
 codeforester
codeforester
Редактировал вопрос 4-го февраля 2017 в 4:21
Программирование
file
linux
unix
diff
Решение / Ответ
Alex Howansky
Alex Howansky
15-го октября 2012 в 5:15
2012-10-15T17:15:56+00:00
Дополнительно
Источник
Редактировать
#17465497

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

cmp --silent $old $new || echo "files are different"
353
0
pn1 dude
pn1 dude
1-го октября 2015 в 1:01
2015-10-01T01:01:55+00:00
Дополнительно
Источник
Редактировать
#17465499

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

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

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

James Pringle
James Pringle
Редактировал ответ 23-го сентября 2016 в 12:29
47
0
 jabaldonedo
jabaldonedo
15-го октября 2012 в 5:08
2012-10-15T17:08:08+00:00
Дополнительно
Источник
Редактировать
#17465494

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

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

#!/bin/bash

file1=`md5 $1`
file2=`md5 $2`

if [ "$file1" = "$file2" ]
then
    echo "Files have the same content"
else
    echo "Files have NOT the same content"
fi
 jabaldonedo
jabaldonedo
Редактировал ответ 25-го июля 2015 в 5:14
17
0
jim mcnamara
jim mcnamara
15-го октября 2012 в 6:38
2012-10-15T18:38:15+00:00
Дополнительно
Источник
Редактировать
#17465498

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

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

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

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

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

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

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

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

4
0
Nono Taps
Nono Taps
23-го сентября 2016 в 12:59
2016-09-23T00:59:59+00:00
Дополнительно
Источник
Редактировать
#17465500

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

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

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

Команда cksum будет выводить количество байт из файла. См. 'человек cksum'.

2
0
Gregory Martin
Gregory Martin
28-го ноября 2018 в 11:27
2018-11-28T23:27:21+00:00
Дополнительно
Источник
Редактировать
#17465502

Потому что я чмо и Дон'т иметь достаточное количество очков репутации, я могу'т добавить этот лакомый кусок в качестве комментария.

Но, если вы собираетесь использовать команду СМР (и Дон'т нужна/хочу быть многословной) вы можете просто захватить статус выхода. В СМР Man-странице:

если файл '-' или отсутствует, читается стандартный ввод. Статус выхода равен 0 если входы одинаковые, если разные 1, 2, Если беда.

Таким образом, вы могли бы сделать что-то вроде:

STATUS="$(cmp --silent $FILE1 $FILE2; echo $?)"  # "$?" gives exit status for each comparison

if [[$STATUS -ne 0]]; then  # if status isn't equal to 0, then execute code
    DO A COMMAND ON $FILE1
else
    DO SOMETHING ELSE
fi
Gregory Martin
Gregory Martin
Редактировал ответ 4-го декабря 2018 в 10:55
2
0
Jack Simth
Jack Simth
9-го ноября 2018 в 5:53
2018-11-09T17:53:09+00:00
Дополнительно
Источник
Редактировать
#17465501

Делаю некоторые тесты с Raspberry Пи 3Б+ (я'м через оверлей файловой системы, и нужно синхронизировать периодически), я провел сравнение по дифф -м и СС -ы; обратите внимание, что это бревно изнутри на /dev/ГИМ, так что доступ к диску скорости-не проблема:

[[email protected] shm]# dd if=/dev/urandom of=test.file bs=1M count=100 ; time diff -q test.file test.copy && echo diff true || echo diff false ; time cmp -s test.file test.copy && echo cmp true || echo cmp false ; cp -a test.file test.copy ; time diff -q test.file test.copy && echo diff true || echo diff false; time cmp -s test.file test.copy && echo cmp true || echo cmp false
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 6.2564 s, 16.8 MB/s
Files test.file and test.copy differ

real    0m0.008s
user    0m0.008s
sys     0m0.000s
diff false

real    0m0.009s
user    0m0.007s
sys     0m0.001s
cmp false
cp: overwrite âtest.copyâ? y

real    0m0.966s
user    0m0.447s
sys     0m0.518s
diff true

real    0m0.785s
user    0m0.211s
sys     0m0.573s
cmp true
[[email protected] shm]# pico /root/rwbscripts/utils/squish.sh

Я делал это пару раз. СМР -с последовательно были немного короче раз на тестовом ящике, который я использовал. Так что если вы хотите использовать ЦМП -s, чтобы сделать вещи между двумя файлами....

identical (){
  echo "$1" and "$2" are the same.
  echo This is a function, you can put whatever you want in here.
}
different () {
  echo "$1" and "$2" are different.
  echo This is a function, you can put whatever you want in here, too.
}
cmp -s "$FILEA" "$FILEB" && identical "$FILEA" "$FILEB" || different "$FILEA" "$FILEB"
0
0
Похожие сообщества 20
DevOps — русскоговорящее сообщество
DevOps — русскоговорящее сообщество
14 834 пользователей
Общаемся на темы DevOps, мониторинга, метрикам и облакам. Новости. См. также: @kubernetes_ru, @docker_ru, @ceph_ru, @openstack_ru FAQ и правила: https://git.io/JtnWb Вакансии и поиск работы: @devops_jobs
Открыть telegram
DevOps Jobs - работа и аналитика
DevOps Jobs - работа и аналитика
12 585 пользователей
Публикуем вакансии и запросы на поиск работы по направлению DevOps & SRE. Обмен инсайдами и аналитикой на рынке труда DevOps & SRE. Вакансии в @devops_jobs_feed FAQ и правила: https://git.io/JtnWb Старт бота "/man" См.также: @devops_ru, @kubernetes_ru
Открыть telegram
GNU/Linux Help
GNU/Linux Help
4 510 пользователей
Правила: https://t.me/grouplinux/1660070 #FAQ: https://t.me/grouplinux/1660058 Linux Flood: https://t.me/+mKsgPMYA_BIzODZi Linux: VFIO PCI Passthrough: @vfiolinux
Открыть telegram
Альт Линукс
Альт Линукс
4 123 пользователей
Открыть telegram
Системное администрирование
Системное администрирование
3 682 пользователей
Чат посвящён любым вопросам системного администрирования. Правила - https://t.me/srv_admins/1472142 Группа по Керио - https://t.me/Kerio_control Вопросы, обратная связь, реклама @SA_FRY_BOT
Открыть telegram
🐧 RU.UBUNTU — Официальное сообщество пользователей Ubuntu Linux
🐧 RU.UBUNTU — Официальное сообщество пользователей Ubuntu Linux
3 242 пользователей
Сообщество пользователей Ubuntu ⚠️ Правила: https://t.me/ru_ubuntu/494413 Список групп и каналов: https://github.com/goq/telegram-list
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
DE
ES
ID
JA
KO
RO
RU
TR
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией