Как проверить, является ли файл Unix .tar.gz допустимым файлом без распаковки?

StackOverflow https://stackoverflow.com/questions/2001709

  •  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

От: http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/how-to-test-file-integrity-of-targz-1138880

Чтобы проверить, что файл 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

но файл был поврежден, теперь вместо «Пит» в нем написано «Дурак».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top