Подтвердить что ты не робот

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

Я также нашел эту ссылку. Но мне было интересно, есть ли готовое решение командной строки?

4b9b3361

Ответ 1

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

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

Отредактировано в соответствии с комментарием. Спасибо zrajm!

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

Ответ 2

возможно, вы можете использовать опцию gzip -t для проверки целостности файлов

http://linux.about.com/od/commands/l/blcmdl1_gzip.htm

from: 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 есть проблема, $? будет иметь ненулевое значение.

Ответ 3

Если вы хотите сделать реальный тестовый экстракт файла 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*

Ответ 4

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

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null

Ответ 5

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

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

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

Ответ 6

Хорошим вариантом является использование 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.

Ответ 7

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

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

Ответ 8

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

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

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