Как проверить tar.gz без распаковки?

Да всё просто, для начала создаем архив:

tar -czvf bashdays.tar.gz /etc

На выходе получаем годный bashdays.tar.gz. Теперь нужно проверить, что этот архив действительно годный и случайно не побился.

Для этого запускаем:

tar -tzf bashdays.tar.gz

Ключ «t» как раз и запускает необходимый тест. Если все хорошо, то команда вернет статус: echo $? ага выдаёт 0. Отлично!

Теперь ломаем архив:

truncate -s -10 bashdays.tar.gz

И после проверки получаем:

tar -tzf bashdays.tar.gz

gzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now

А echo $? ага выдаёт 2. Ага. Зная это ты можешь тестировать архивы без распаковки и затем заливать их, например, в S3.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Зная это ты можешь тестировать архивы без распаковки и затем заливать их, например, в S3.

Еще можно протестировать так:

gzip -t bashdays.tar.gz

Ну или банально распаковать в дев/нуль:

tar -xzf bashdays.tar.gz -O > /dev/null

Bash-скрипт для проверки может выглядеть так:

#!/bin/bash

# Проверяем, передан ли аргумент
if [ $# -ne 1 ]; then
    echo "Использование: $0 <файл архива>"
    exit 1
fi

ARCHIVE="$1"

# Проверяем, существует ли файл
if [ ! -f "$ARCHIVE" ]; then
    echo "Ошибка: файл '$ARCHIVE' не найден!"
    exit 2
fi

# Определяем тип архива
if [[ "$ARCHIVE" == *.tar.gz || "$ARCHIVE" == *.tgz ]]; then
    echo "Архив '$ARCHIVE' определён как tar.gz"
    FORMAT="tar.gz"
elif [[ "$ARCHIVE" == *.tar ]]; then
    echo "Архив '$ARCHIVE' определён как tar"
    FORMAT="tar"
else
    echo "Ошибка: неподдерживаемый формат архива!"
    exit 3
fi

# Проверяем целостность архива
echo "Проверка содержимого архива..."
if ! tar -tzf "$ARCHIVE" &>/dev/null; then
    echo "Ошибка: tar.gz архив повреждён!"
    exit 4
fi

if [[ "$FORMAT" == "tar.gz" ]]; then
    echo "Дополнительная проверка gzip..."
    if ! gzip -t "$ARCHIVE" &>/dev/null; then
        echo "Ошибка: gzip-архив повреждён!"
        exit 5
    fi
fi

echo "Архив '$ARCHIVE' проверен: ошибок не обнаружено."
exit 0

Чмодим и запускаем:

chmod +x check_tar.sh
./check_tar.sh bashdays.tar.gz

Такие дела.

Чуть позже покажу какие есть способы проверять целостность архивов, которые ты заливаешь в S3. Очень полезно это проверять в рамках бекапов, когда локально оно у тебя все хорошо, а в S3 все нахуй битое-побитое лежит.