Проверка конкретного файла в архиве по порядковому номеру

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

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


Что подразумевается под «проверить архив 4 из 20 по номеру»

  • Архив – сжатый контейнер (ZIP, RAR, 7Z, TAR.GZ и т.п.), содержащий 20 файлов.
  • Проверить по номеру – убедиться, что файл с порядковым номером 4 (с учётом сортировки, обычно по имени) существует, цел и может быть извлечён без ошибок.
  • Проверка может включать:
    • просмотр списка содержимого;
    • извлечение только нужного файла;
    • контрольную сумму (CRC, MD5, SHA‑256) для подтверждения целостности;
    • вывод сообщения об ошибке, если файл отсутствует или повреждён.

Инструменты, которые понадобятся

  1. unzip – для работы с ZIP‑архивами (Linux/macOS, также есть порт для Windows).
  2. 7z – универсальный архиватор, поддерживает ZIP, RAR, 7Z, TAR, GZ и многие другие форматы.
  3. unrar – специфичный для RAR‑архивов.
  4. tar – стандартная утилита для TAR и сжатых вариантов (TAR.GZ, TAR.BZ2, TAR.XZ).
  5. md5sum / sha256sum – для вычисления контрольных сумм.
  6. awk, sed, head, tail – для выбора нужной строки из списка файлов.

Все перечисленные утилиты доступны в репозиториях большинства дистрибутивов Linux; в Windows можно использовать WSL, Cygwin или портированные версии (например, 7‑Zip имеет командную строку 7z.exe).


Общий алгоритм проверки

  1. Получить список файлов внутри архива, отсортированный по имени (или по другому критерию, если требуется).
  2. Извлечь четвёртую запись из этого списка.
  3. Проверить, существует ли такой файл (не пустая строка).
  4. Вытащить файл во временную директорию.
  5. Вычислить контрольную сумму и сравнить её с эталонной (если она известна) либо просто убедиться, что извлечение прошло без ошибок.
  6. Удалить временные файлы (по желанию).

Ниже показаны конкретные команды для самых распространённых форматов.


Примеры для разных типов архивов

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.

Проверка конкретного элемента архива по его порядковому номеру – задача, которую легко решить с помощью стандартных командных утилит. Ключевые шаги:

  1. Получить список файлов внутри архива.
  2. Выбрать четвёртую строку (с учётом сортировки).
  3. Извлечь только этот файл.
  4. Убедиться, что извлечение прошло без ошибок и, при необходимости, сравнить контрольную сумму.

Приведённые примеры покрывают самые популярные форматы (ZIP, RAR, TAR.GZ, 7Z) и могут быть легко адаптированы под другие типы архивов или интегрированы в более сложные скрипты автоматизации. Главное – помнить о проверке наличия выбранного файла и обработке возможных ошибок, тогда ваш процесс проверки будет надёжным и прозрачным.


Автор: ваш помощник по техническим вопросам.