Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья7 мин чтенияПросмотры2

tar --compare: как сверить архив с исходным каталогом до очистки

Воспроизводимая проверка GNU tar 1.35: сравниваем архив с каталогом без распаковки поверх данных, различаем коды 0, 1 и 2 и показываем важную границу — лишний файл команда не замечает.

Комментарии 0

Архивный картридж и папки-эталоны под фиолетовым инспекционным светом в светлом помещении
В этой статье

tar --compare отвечает на узкий вопрос: совпадают ли участники архива с файлами в каталоге, из которого сделана копия. Команда не распаковывает архив поверх исходных данных. Код 0 означает, что различий среди участников архива не найдено; код 1 — что есть отличия; код 2 — что проверка завершилась с ошибкой.

Участник архива — запись внутри tar с путём и метаданными. Файловое соответствие — объект с тем же путём в выбранном каталоге. Это важно: команда начинает с состава архива, а не ищет всё, что лежит рядом на диске.

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

Входные условия

  • Linux с GNU tar; проверка ниже выполнена на GNU tar 1.35.

  • Архив backup.tar и каталог-источник, относящиеся к одной точке времени.

  • Права чтения архива и всех сравниваемых файлов.

  • Изолированный временный каталог: команды примера не обращаются к рабочему сайту и сети.

tar --version

tar (GNU tar) 1.35

В тесте от 24 октября 2026 года использованы два коротких текстовых файла: site/index.html и db/catalog.sql. Это учебные данные, не копия клиента или рабочей базы.

Подготавливаем безопасный стенд

lab_dir="$(mktemp -d)"

printf '%s\n' "$lab_dir"

mkdir -p -- "$lab_dir/source/site" "$lab_dir/source/db"

printf '%s\n' 'version=A' > "$lab_dir/source/site/index.html"

printf '%s\n' 'rows=42' > "$lab_dir/source/db/catalog.sql"

find "$lab_dir/source" -type f -exec touch -d '2026-10-24 00:00:00 UTC' {} +

tar --create --file="$lab_dir/backup.tar" --directory="$lab_dir/source" .

Переменная lab_dir определяется первой командой. Все операции записи ниже ограничены созданным mktemp-каталогом. Дата файлов фиксируется только для воспроизводимости сравнения: она не является рекомендацией для рабочих копий.

Первое сравнение: архив и каталог совпадают

cp -a -- "$lab_dir/source" "$lab_dir/match"

tar --compare --file="$lab_dir/backup.tar" --directory="$lab_dir/match"

printf 'rc=%s\n' "$?"

rc=0

Пустой вывод вместе с кодом 0 означает, что GNU tar не нашёл различий среди участников backup.tar и их файловых соответствий в match. Один пустой вывод без сохранённого кода недостаточен: автоматизация должна проверять оба признака.

Изменение одного байта при прежнем размере и времени

cp -a -- "$lab_dir/source" "$lab_dir/changed"

printf 'B' | dd of="$lab_dir/changed/site/index.html" bs=1 seek=8 conv=notrunc status=none

touch -r "$lab_dir/source/site/index.html" "$lab_dir/changed/site/index.html"

tar --compare --file="$lab_dir/backup.tar" --directory="$lab_dir/changed"

./site/index.html: Contents differ

Команда завершилась с кодом 1. Размер и mtime файла были сохранены, но GNU tar прочитал содержимое и обнаружил замену A на B. Это полезное отличие от проверки только имени, размера и времени.

Отсутствующий файл и изменённый режим

Для сценария отсутствия файл не удаляется безвозвратно: он переносится за пределы сравниваемого каталога, но остаётся внутри временного стенда.

cp -a -- "$lab_dir/source" "$lab_dir/missing"

mv -- "$lab_dir/missing/db/catalog.sql" "$lab_dir/catalog.sql.off"

tar --compare --file="$lab_dir/backup.tar" --directory="$lab_dir/missing"

tar: ./db/catalog.sql: Warning: Cannot stat: No such file or directory

Результат — код 1: участник архива не найден в каталоге. В отдельном сценарии chmod 0600 для site/index.html при исходном 0644 дал сообщение Mode differs и тот же код 1. Следовательно, сравнение относится не только к содержимому, но и к метаданным, которые хранит архив.

Подвох: лишний файл остаётся незамеченным

cp -a -- "$lab_dir/source" "$lab_dir/extra"

printf '%s\n' 'not in archive' > "$lab_dir/extra/unlisted.txt"

tar --compare --file="$lab_dir/backup.tar" --directory="$lab_dir/extra"

printf 'rc=%s\n' "$?"

rc=0

tar идёт от участников архива к файловой системе. Поэтому unlisted.txt, которого нет в backup.tar, не входит в сравнение и не меняет код. Код 0 не доказывает, что архив содержит всё, что сейчас есть в каталоге. Полноту состава нужно проверять отдельно по ожидаемому перечню или снимку файлов.

Участники TAR сопоставляются с двумя путями файловой системы, а unlisted.txt остаётся вне области сравнения
GNU tar сопоставляет участников архива с путями файловой системы. unlisted.txt не имеет участника в архиве, поэтому --compare его не проверяет.

Сценарий

Наблюдение

Код

Вывод

Полное совпадение

вывод пуст

0

различия среди участников архива не найдены

Один байт изменён

Contents differ

1

содержимое отличается

Файл отсутствует

Cannot stat

1

участник архива не найден

Режим 0644 → 0600

Mode differs

1

метаданные отличаются

В каталоге есть лишний файл

вывод пуст

0

лишний файл не входит в область проверки

Пять исходов tar --compare: совпадение, изменённый байт, отсутствующий файл, изменённый режим и лишний файл с кодами 0 и 1
Пять исходов учебного теста GNU tar 1.35. Код 0 означает лишь отсутствие различий среди участников архива; лишний файл на диске остаётся вне области проверки.

Как читать коды завершения

Официальное руководство GNU tar описывает --compare / --diff как сравнение участников архива с файловой системой и перечисляет проверяемые признаки. В разделе о кодах завершения код 1 означает найденные различия при --compare, а код 2 — фатальную ошибку.

Для отдельной проверки фатальной ошибки в том же временном стенде указан архив, которого не существует:

tar --compare --file="$lab_dir/no-such.tar" --directory="$lab_dir/match"

printf 'rc=%s\n' "$?"

rc=2

Код 2 здесь означает не найденное отличие файлов, а невозможность выполнить проверку: архив открыть нельзя. В автоматизации этот статус нужно отделять от RC 1.

Не объединяйте 1 и 2 в общий статус «архив испорчен». Код 1 может отражать ожидаемое изменение каталога после снимка. Код 2 означает, что сама операция проверки не завершилась штатно: например, архив недоступен или не читается.

Безопасная очистка учебного стенда

Сначала выведите путь и убедитесь, что он относится к временному каталогу. Очистка ниже разрешена только тогда, когда путь соответствует каталогу, который mktemp создал по заданному шаблону в TMPDIR или /tmp; при другом пути команда останавливается.

case "$lab_dir" in "${TMPDIR:-/tmp}"/tmp.*) rm -rf -- "$lab_dir" ;; *) printf 'cleanup stopped: %s\n' "$lab_dir" >&2 ;; esac

Где эта проверка находится в приёмке бэкапа

  1. Сразу после создания архива зафиксируйте исходное дерево файлов или снапшот и версию GNU tar.

  2. Выполните tar --compare и сохраните полный вывод вместе с кодом завершения.

  3. При коде 1 разделите отличие содержимого, отсутствие файла и отличие метаданных; не делайте вывод о причине по одной строке вывода.

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

  5. После успешной сверки проверьте целостность переданного архива и выполните тестовое восстановление в изоляции.

Если исходного каталога уже нет, проверка tar.gz до распаковки отвечает на другой вопрос: читаются ли gzip-поток и структура tar. SHA-256-манифест помогает обнаружить изменение уже сохранённых файлов. Ни одна из этих проверок не заменяет восстановление приложения.

Границы результата

  • Сравнение не доказывает полноту архива относительно бизнес-требований.

  • Команда не подтверждает согласованность дампа работающей базы.

  • Лишний файл в каталоге, которого нет в архиве, не делает результат ненулевым.

  • Рабочий каталог с продолжающейся записью может дать различия, возникшие уже после создания копии.

  • Проверка не подтверждает подлинность архива и не заменяет защищённый манифест или подпись.

  • Результаты и формулировки относятся к GNU tar 1.35; в другой реализации и версии вывод может отличаться.

Критерий готовности: tar --compare завершился кодом 0 на каталоге той же точки времени, ожидаемый состав проверен отдельно, а вывод и версия инструмента сохранены. Только после этого имеет смысл переходить к проверке передачи и тестовому восстановлению.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.