Как проверить, является ли файл Unix .tar.gz действительным файлом без распаковки? - PullRequest
93 голосов
/ 04 января 2010

Я нашел вопрос Как определить, являются ли данные действительными tar-файлом без файла? , но мне было интересно: есть готовое решение командной строки?

Ответы [ 8 ]

106 голосов
/ 04 января 2010

Как насчет того, чтобы получить список tar-архивов и выбросить вывод, а не распаковывать файл?

tar -tzf my_tar.tar.gz >/dev/null

Отредактировано согласно комментарию. Спасибо, Зрайм!

Редактировать согласно комментарию. Спасибо Frozen Flame! Этот тест никоим образом не подразумевает целостность данных. Поскольку он был спроектирован как утилита архивирования на магнитной ленте, большинство реализаций tar позволяют создавать несколько копий одного и того же файла!

89 голосов
/ 04 января 2010

вы, вероятно, можете использовать опцию 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 (успех) значение. Если либо смола или у gzip есть проблема, $? будет иметь ненулевое значение.

28 голосов
/ 17 января 2012

Если вы хотите выполнить настоящий тестовый извлечение файла tar без извлечения на диск, используйте параметр -O Это изменит экстракт на стандартный вывод вместо файловой системы. Если файл tar поврежден, процесс будет прерван с ошибкой.

Пример неудачного теста тарного шара ...

$ 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*
11 голосов
/ 09 декабря 2012

Вы также можете проверить содержимое файла * .tag.gz, используя pigz (параллельный gzip), чтобы ускорить проверку архива:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
3 голосов
/ 19 февраля 2016

Я попробовал следующую команду, и они хорошо работают.

bzip2 -t file.bz2
gunzip -t file.gz

Однако мы можем обнаружить, что эти две команды отнимают много времени. Может быть, нам нужен более быстрый способ определить неповрежденные файлы сжатия.

1 голос
/ 13 мая 2017

Это все очень неоптимальные решения. Из спецификации GZIP

ID2 (IDentification 2)
Они имеют фиксированные значения ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), чтобы определить файл в формате gzip.

Должен быть закодирован на любом языке, который вы используете.

1 голос
/ 01 августа 2013

Хорошим вариантом является использование 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.
0 голосов
/ 16 октября 2012

> используйте опцию -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

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

...