Как проверить, является ли файл Unix .tar.gz допустимым файлом без распаковки?
-
18-09-2019 - |
Вопрос
Я нашел нужный вопрос Как определить, являются ли данные допустимыми в tar-файле без файла?, но мне было интересно:существует ли готовое решение для командной строки?
Решение
А как насчет того, чтобы просто получить листинг архива и выбросить вывод вместо того, чтобы распаковывать файл?
tar -tzf my_tar.tar.gz >/dev/null
Отредактировано согласно комментарию.Спасибо, Зрайм!
Отредактируйте согласно комментарию.Спасибо Frozen Flame! Этот тест никоим образом не подразумевает целостность данных.Поскольку он был разработан как утилита архивирования лент, большинство реализаций tar допускают создание нескольких копий одного и того же файла!
Другие советы
вероятно, вы могли бы использовать опцию gzip -t для проверки целостности файлов
http://linux.about.com/od/commands/l/blcmdl1_gzip.htm
Чтобы проверить, что файл gzip не поврежден:
gunzip -t file.tar.gz
Чтобы проверить, не поврежден ли tar-файл внутри:
gunzip -c file.tar.gz | tar t > /dev/null
В качестве части резервного копирования вы, вероятно, могли бы просто запустить последнюю команду и проверить значение $?после этого для значения 0 (успех).Если либо в tar , либо в gzip есть проблема, $?будет иметь ненулевое значение.
Если вы хотите выполнить реальное тестовое извлечение tar-файла без извлечения на диск, используйте опцию -O.Это выводит экстракт на стандартный вывод вместо файловой системы.Если файл tar поврежден, процесс будет прерван с ошибкой.
Пример неудачного теста tar ball...
$ echo "this will not pass the test" > hello.tgz
$ tar -xvzf hello.tgz -O > /dev/null
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error exit delayed from previous errors
$ rm hello.*
Рабочий пример...
$ ls hello*
ls: hello*: No such file or directory
$ echo "hello1" > hello1.txt
$ echo "hello2" > hello2.txt
$ tar -cvzf hello.tgz hello[12].txt
hello1.txt
hello2.txt
$ rm hello[12].txt
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz -O
hello1.txt
hello1
hello2.txt
hello2
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz
hello1.txt
hello2.txt
$ ls hello*
hello1.txt hello2.txt hello.tgz
$ rm hello*
Вы также можете проверить содержимое файла *.tag.gz, используя pigz
(параллельный gzip) для ускорения проверки архива:
pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
Я попробовал следующую команду, и они работают хорошо.
bzip2 -t file.bz2
gunzip -t file.gz
Однако мы можем обнаружить, что эти две команды отнимают много времени.Возможно, нам нужен более быстрый способ определить целостность сжатых файлов.
Хороший вариант — использовать tar -tvvf <filePath>
который добавляет строку, сообщающую тип файла.
Пример в допустимом файле .tar:
> tar -tvvf filename.tar
drwxr-xr-x 0 diegoreymendez staff 0 Jul 31 12:46 ./testfolder2/
-rw-r--r-- 0 diegoreymendez staff 82 Jul 31 12:46 ./testfolder2/._.DS_Store
-rw-r--r-- 0 diegoreymendez staff 6148 Jul 31 12:46 ./testfolder2/.DS_Store
drwxr-xr-x 0 diegoreymendez staff 0 Jul 31 12:42 ./testfolder2/testfolder/
-rw-r--r-- 0 diegoreymendez staff 82 Jul 31 12:42 ./testfolder2/testfolder/._.DS_Store
-rw-r--r-- 0 diegoreymendez staff 6148 Jul 31 12:42 ./testfolder2/testfolder/.DS_Store
-rw-r--r-- 0 diegoreymendez staff 325377 Jul 5 09:50 ./testfolder2/testfolder/Scala.pages
Archive Format: POSIX ustar format, Compression: none
Поврежденный файл .tar:
> tar -tvvf corrupted.tar
tar: Unrecognized archive format
Archive Format: (null), Compression: none
tar: Error exit delayed from previous errors.
Все это очень неоптимальные решения.Из самого Спецификация GZIP
ID2 (идентификация 2)
Они имеют фиксированные значения ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \213), чтобы идентифицировать файл как находящийся в формате gzip.
Должен быть закодирован на любом языке, который вы используете.
> используйте опцию -O.[...] Если файл tar поврежден, процесс прервется с ошибкой.
Иногда да, но иногда нет.Давайте посмотрим пример поврежденного файла:
echo Pete > my_name
tar -cf my_data.tar my_name
# // Simulate a corruption
sed < my_data.tar 's/Pete/Fool/' > my_data_now.tar
# // "my_data_now.tar" is the corrupted file
tar -xvf my_data_now.tar -O
Это показывает:
my_name
Fool
Даже если вы выполните
echo $?
tar сказал, что ошибки нет:
0
но файл был поврежден, теперь вместо «Пит» в нем написано «Дурак».