Как проверить 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.
Еще можно протестировать так:
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 все нахуй битое-побитое лежит.








Комментарии