В работе с большими наборами файлов часто возникает необходимость проверить конкретный элемент архива – например, убедиться, что четвёртый файл из двадцати присутствует, не повреждён и доступен для извлечения. Ниже подробно описано, как это сделать с помощью популярных утилит и скриптов, а также какие нюансы следует учитывать.
Что подразумевается под «проверить архив 4 из 20 по номеру»
- Архив – сжатый контейнер (ZIP, RAR, 7Z, TAR.GZ и т.п.), содержащий 20 файлов.
- Проверить по номеру – убедиться, что файл с порядковым номером 4 (с учётом сортировки, обычно по имени) существует, цел и может быть извлечён без ошибок.
- Проверка может включать:
- просмотр списка содержимого;
- извлечение только нужного файла;
- контрольную сумму (CRC, MD5, SHA‑256) для подтверждения целостности;
- вывод сообщения об ошибке, если файл отсутствует или повреждён.
Инструменты, которые понадобятся
- unzip – для работы с ZIP‑архивами (Linux/macOS, также есть порт для Windows).
- 7z – универсальный архиватор, поддерживает ZIP, RAR, 7Z, TAR, GZ и многие другие форматы.
- unrar – специфичный для RAR‑архивов.
- tar – стандартная утилита для TAR и сжатых вариантов (TAR.GZ, TAR.BZ2, TAR.XZ).
- md5sum / sha256sum – для вычисления контрольных сумм.
- awk, sed, head, tail – для выбора нужной строки из списка файлов.
Все перечисленные утилиты доступны в репозиториях большинства дистрибутивов Linux; в Windows можно использовать WSL, Cygwin или портированные версии (например, 7‑Zip имеет командную строку 7z.exe).
Общий алгоритм проверки
- Получить список файлов внутри архива, отсортированный по имени (или по другому критерию, если требуется).
- Извлечь четвёртую запись из этого списка.
- Проверить, существует ли такой файл (не пустая строка).
- Вытащить файл во временную директорию.
- Вычислить контрольную сумму и сравнить её с эталонной (если она известна) либо просто убедиться, что извлечение прошло без ошибок.
- Удалить временные файлы (по желанию).
Ниже показаны конкретные команды для самых распространённых форматов.
Примеры для разных типов архивов
ZIP‑архив
# 1. Список файлов (только имена, без путей)
unzip -l archive.zip | awk 'NR>3 {print $4}' | head -n 20 > list.txt
FILE=$(sed -n '4p' list.txt)
if [ -z "$FILE" ]; then
echo "Ошибка: в архиве меньше 4 файлов"
exit 1
fi
mkdir -p /tmp/check_archive
unzip -j archive.zip "$FILE" -d /tmp/check_archive
if [ $? -ne 0 ]; then
echo "Не удалось извлечь файл '$FILE'"
else
echo "Файл '$FILE' успешно извлечён в /tmp/check_archive"
# Опционально: считаем контрольную сумму
sha256sum /tmp/check_archive/"$FILE"
fi
RAR‑архив
# Список файлов
unrar l archive.rar | awk 'NR>5 {print $NF}' | head -n 20 > list.txt
FILE=$(sed -n '4p' list.txt)
if [ -z "$FILE" ]; then
echo "Ошибка: меньше 4 файлов в архиве"
exit 1
fi
unrar e -y archive.rar "$FILE" /tmp/check_archive/
if [ $? -eq 0 ]; then
echo "Файл '$FILE' извлечён"
sha256sum /tmp/check_archive/"$FILE"
else
echo "Ошибка извлечения"
fi
TAR.GZ (или TAR.BZ2, TAR.XZ)
# Список файлов
tar -tzf archive.tar.gz | head -n 20 > list.txt # для .tar.gz
FILE=$(sed -n '4p' list.txt)
if [ -z "$FILE" ]; then
echo "Ошибка: архив содержит меньше 4 файлов"
exit 1
fi
tar -xzf archive.tar.gz "$FILE" -C /tmp/check_archive # для .tar.gz
if [ $? -eq 0 ]; then
echo "Файл '$FILE' извлечён"
sha256sum /tmp/check_archive/"$FILE"
else
echo "Не удалось извлечь '$FILE'"
fi
7Z‑архив (универсальный)
# Список
7z l archive.7z | awk '/^[0-9]+/ {print $6}' | head -n 20 > list.txt
FILE=$(sed -n '4p' list.txt)
if [ -z "$FILE" ]; then
echo "Ошибка: меньше 4 файлов"
exit 1
fi
7z x -y -o/tmp/check_archive archive.7z "$FILE"
if [ $? -eq 0 ]; then
echo "Файл '$FILE' извлечён"
sha256sum /tmp/check_archive/"$FILE"
else
echo "Ошибка извлечения"
fi
Как автоматизировать проверку для множества архивов
Если нужно проверить серию архивов archive_01.zip, archive_02.zip, …, archive_20.zip и убедиться, что в каждом из них четвёртый файл цел, можно воспользоваться простым циклом в Bash:
#!/bin/bash
for i in {01..20}; do
ARCH="archive_${i}.zip"
echo "Проверяем $ARCH"
unzip -l "$ARCH" | awk 'NR>3 {print $4}' | head -n 20 > /tmp/list_$$.txt
FILE=$(sed -n '4p' /tmp/list_$$.txt)
if [ -z "$FILE" ]; then
echo " -> Ошибка: меньше 4 файлов"
continue
fi
unzip -j "$ARCH" "$FILE" -d /tmp/check_$$ 2>/dev/null
if [ $? -eq 0 ]; then
echo " -> Файл '$FILE' OK"
sha256sum /tmp/check_$$/"$FILE"
else
echo " -> Ошибка извлечения '$FILE'"
fi
rm -rf /tmp/check_$$ /tmp/list_$$.txt
done
Скрипт выводит для каждого архива:
- название архива;
- результат проверки (OK/ошибка);
- контрольную сумму извлечённого файла (если успешно).
Что делать, если файл повреждён
- Попробовать другой инструмент – иногда один архиватор лучше справляется с повреждёнными данными (например,
7zчасто восстанавливает больше, чемunzip). - Использовать параметр восстановления – у
7zесть опция-tдля теста целостности:7z t archive.7z. - Проверить наличие резервной копии – если архив является частью набора резервных копий, имеет смысл взять тот же файл из другого архива.
- Записать результат в лог – для дальнейшего анализа полезно сохранять вывод проверки в файл
check.log.
Проверка конкретного элемента архива по его порядковому номеру – задача, которую легко решить с помощью стандартных командных утилит. Ключевые шаги:
- Получить список файлов внутри архива.
- Выбрать четвёртую строку (с учётом сортировки).
- Извлечь только этот файл.
- Убедиться, что извлечение прошло без ошибок и, при необходимости, сравнить контрольную сумму.
Приведённые примеры покрывают самые популярные форматы (ZIP, RAR, TAR.GZ, 7Z) и могут быть легко адаптированы под другие типы архивов или интегрированы в более сложные скрипты автоматизации. Главное – помнить о проверке наличия выбранного файла и обработке возможных ошибок, тогда ваш процесс проверки будет надёжным и прозрачным.
Автор: ваш помощник по техническим вопросам.