Як перевірити, чи файл Unix .tar.gz є дійсним файлом без розпакування?


Відповіді:


121

А як просто отримати список тарболу та викинути вихід, а не розпаковувати файл?

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

Відредаговано відповідно до коментаря. Дякую zrajm!

Редагувати відповідно до коментаря. Спасибі Заморожене полум'я! Цей тест жодним чином не передбачає цілісності даних. Оскільки він був розроблений як архівна утиліта стрічки, більшість реалізацій tar дозволить отримати кілька копій одного файлу!


13
Навіщо використовувати, -vякщо ви просто перекладаєте вихід /dev/null?
zrajm

2
Правда @zrajm. Вгадайте, що це моя м'язова пам’ять, що б'є! (-:
Роб Уеллс

5
Цей -zваріант також непотрібний. У режимі вилучення чи списку він нічого не робить.
асмеурер

1
@asmeurer Re: Очевидно, -zщо це стосується гудрону GNU - чи знаєте ви, чи справді це в іншому місці (BSD тощо)?
белакква

2
@bobwells Але чи успішний розтиснення файлів чи файлів вмісту означає цілісність даних tar.gz? Будь-яка інформація про підтримку?
Заморожене полум'я

99

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


3
І bzip2 -t file.bz2для файлів bz2.
асмеурер

4
Хіба це не просто використання двох команд, щоб зробити те, що робить "tar -tzf my_tar.tar.gz> / dev / null"?
Роб Уеллс

Хіба це не повинно бути tar -t > /dev/null(примітка: tvs -t)?
Інтразір. Провідник

1
@IntrastellarExplorer - це друкарська помилка з мого боку, хоча вона все ще повинна працювати без дефісу. Я просто звик до старих варіантів стилю на дьогті. unix.stackexchange.com/questions/394060/…
Джон Бокер

32

Якщо ви хочете зробити справжній тестовий витяг файлу 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*

1
Мені здається, найкращим тестом є саме цей. Він справді витягує кожен файл і гарантує відсутність помилок.
рукави

Дійсно корисна. Я створив скрипт оболонки, додаю гачок аргументу, щоб пройти шлях до файлу і поставити його на свій шлях :) [tar -xvzf $ 1 -O> / dev / null]
smonff

@sleeves Чому ви вважаєте, що це краще, ніж прийнята відповідь? tar -tvzf hello.tgz> / dev / null також дає таку ж помилку.
dash17291

5
@ dash17291 Я кажу про це, тому що я вважаю, що це буде складною проблемою, щоб довести, що для всіх випадків a -tvf виявить усі помилки чи пошкодження, які є -xvf. Іншими словами, -xvf спіймає все, що -tvf, але я не можу сказати, що зворотне правда.
рукави

Можливо, вам слід скористатися і > /dev/nullдля робочого прикладу.
травень

12

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

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

Міні-орієнтир: запуск його з pigz -cvd: 80s, під час роботи з прийнятим відповіді tar -tzv: 143s в архіві 22G.
Wadih M.

як вам видалити сповіщення з cronjob про "tar: видалення провідних` / 'з імен членів "при використанні цього методу?
MaXi32

3

Я спробував наступну команду, і вони добре працюють.

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

Однак ми можемо виявити, що ці дві команди трудомісткі. Можливо, нам знадобиться ще якийсь швидкий спосіб визначити неушкодженість файлів стиснення.


2

Приємним варіантом є використання, 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.

Це відбувається на BSD-дьогті, але не на ДГ тарі.
mcallister

1

Це все дуже неоптимальні рішення. Від специфікації GZIP

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

Необхідно кодувати будь-якою мовою.


якщо файл урізаний, це може здатися, що для виявлення потрібна повна декомпресія
philwalk

0

> використовувати опцію -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 $?

Тар сказав, що помилки не було:

0

але файл був пошкоджений, він тепер замість "Pete" має "Fool".


Люди рідко використовують файли tar без будь-якого стиснення. Я думаю, ваше зауваження стосується лише нестиснених файлів.
Jarekczek

6
Ви плутаєте цілісність із корупцією. Ваш файл втратив цілісність, але він все ще є прийнятним форматом архіву.
Філ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.