Вычисление контрольных сумм выглядит для меня излишним, если вы хотите обнаружить только «дополнительные» файлы. Вам не нужно проверять фактические данные (содержимое файла); вам нужно проверить метаданные (существующие пути).
Чтобы получить все относительные пути внутри /synced/dir
, запустите
(cd /synced/dir && find . | sort) > structure.txt
Делайте это с обеих сторон, затем diff
получайте файлы. Обратите внимание, что ситуация симметрична, поэтому вы обнаружите «дополнительные», а также «отсутствующие» файлы на любой стороне («дополнительные» здесь эквивалентны «отсутствующим» там, и наоборот).
Чтобы игнорировать «дополнительные» файлы с одной (или другой) стороны, отфильтруйте diff
вывод с помощью grep '^>'
(или grep '^<'
соответственно).
Если две директории доступны (смонтированы) в одной системе, этот синтаксис Bash может быть полезен:
diff <(cd /original/dir && find . | sort) <(cd /backup/dir && find . | sort) | grep '^>'
Это не совсем надежно (например, переводы строк в именах файлов могут нарушить логику), мой пример более похож на доказательство концепции. Дело в том, что вы обнаруживаете дополнительные файлы, не читая содержимое файла вообще.
Заметки:
sort
необходим, потому что эти дваfind
могут возвращать записи в различной последовательности, даже если каталоги являются точными копиями;- sole
diff
может сравнивать каталоги, но этот режим здесь бесполезен, потому что он пытается сравнить содержимое соответствующих файлов, такого поведения мы хотим избежать в первую очередь.