
Я нашел отэта публикация на Stackoverflow, если вы просто хотите получить список соответствующих файлов, содержимое которых отличается, то вы можете выполнить:
diff --brief --recursive dir1/ dir2/
...и попробовав сделать это сам, я получил небольшой список файлов, содержимое которых отличается.
Но если я сделал резервную копию исходной файловой системы (предположим, БОЛЬШИЕ файловые системы, например, 2 ТБ), и я хочу проверить, совпадает ли резервная копия с оригиналом (например, я хочу проверить, успешно ли выполнено резервное копирование), что мне следует запустить, если меня интересуют только файлы, которые НЕ доступны ни на одной из сторон? Мне нужно что-то, что БЫСТРО проверяет деревья каталогов (не проверяя содержимое).
Хотя сравнение размера файла не дает абсолютного представления о том, отличается ли резервная копия файла, сравнение этого размера и других метаданных, не относящихся к содержимому файла, во время выполнения команды сравнения может помочь.
(Прошу прощения за повторную публикацию очень похожего вопроса, но я заметил, что один пользователь утверждал, что вопрос, возможно, не по теме, поэтому его определенно следует разместить на StackOverflow.)
Есть ли у вас опыт по этому поводу?
решение1
Решение без rsync, проверяющее время модификации и размер файла:
diff <(find dir1 -mindepth 1 -printf '%P %t %s\n' | sort) <(find dir2 -mindepth 1 -printf '%P %t %s\n' | sort) | grep -E '^[<>]'
Пример вывода:
> bar Sat Sep 14 11:52:33.0544384394 2013 91
< foo Fri Sep 13 17:58:21.0213671425 2013 445
> foo Sun Sep 8 23:01:02.0355432619 2013 347
Показывает, что foo
было изменено dir1
и bar
существует только в dir2
.
решение2
Вы не сообщаете нам, какое решение для резервного копирования вы используете, но почти все настоящие программы резервного копирования имеют режим «проверки». («Настоящим» инструментом резервного копирования в этом контексте является что-то вроде Bacula, программное обеспечение, специально разработанное для резервного копирования и восстановления).
При прочих равных условиях я бы рекомендовал использовать настоящее программное обеспечение для резервного копирования и его встроенные инструменты проверки.
Все остальные условия НЕ равны, rsync -nav --delete <backup> <original>
таково мое предложение.
Этоделаетпроверить содержимое и сообщит вам о дополнительных файлах, различных файлах и отсутствующих файлах. Это не так глубоко (медленно), как diff
, и -n
означает, что это фактически не коснется файловой системы.
решение3
В результате ответов выше у меня родился следующий небольшой сценарий, которым я хочу поделиться:
# vi /bin/checkbackup
#!/bin/bash
echo "1/5: Checking source files..."
find "$1" -type f -printf "%P %s\n" | sort > ~/.checkbackup_files.tmp
echo "2/5: Comparing destination files..."
find "$2" -type f -printf "%P %s\n" | sort | diff - ~/.checkbackup_files.tmp
echo "3/5: Checking source directories..."
find "$1" -type d -printf "%P\n" | sort > ~/.checkbackup_dirs.tmp
echo "4/5: Comparing destination directories..."
find "$2" -type d -printf "%P\n" | sort | diff - ~/.checkbackup_dirs.tmp
echo "5/5: Cleaning up"
rm -f ~/.checkbackup_files.tmp
rm -f ~/.checkbackup_dirs.tmp
# chmod 755 /bin/checkbackup
Использование:
$ checkbackup /path/to/dir1 /path/to/dir2
Отсутствие отчетов означает, что структура папок и имена одинаковы, а файлы имеют одинаковые размеры и имена, без каких-либо пропусков.
Тестирование проводилось на деревьях каталогов объемом 1,5 ТБ на дисках SATA2 со скоростью вращения 5400 об/мин. Процесс завершался примерно за 5 минут.
Этот скрипт ни в коем случае не закончен, несомненно, есть другие, лучшие, более быстрые и более глубокие инструменты с большим количеством проверок. Но я подумал, что все равно поделюсь им.