Я знайшов питання Як визначити, чи дані є дійсним файлом tar без файлу? , але мені було цікаво: чи є готове рішення командного рядка?
Я знайшов питання Як визначити, чи дані є дійсним файлом tar без файлу? , але мені було цікаво: чи є готове рішення командного рядка?
Відповіді:
А як просто отримати список тарболу та викинути вихід, а не розпаковувати файл?
tar -tzf my_tar.tar.gz >/dev/null
Відредаговано відповідно до коментаря. Дякую zrajm!
Редагувати відповідно до коментаря. Спасибі Заморожене полум'я! Цей тест жодним чином не передбачає цілісності даних. Оскільки він був розроблений як архівна утиліта стрічки, більшість реалізацій tar дозволить отримати кілька копій одного файлу!
-z
варіант також непотрібний. У режимі вилучення чи списку він нічого не робить.
-z
що це стосується гудрону GNU - чи знаєте ви, чи справді це в іншому місці (BSD тощо)?
tar.gz
? Будь-яка інформація про підтримку?
ви, можливо, можете скористатися параметром 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 мають проблему, $? матиме ненульове значення.
bzip2 -t file.bz2
для файлів bz2.
tar -t > /dev/null
(примітка: t
vs -t
)?
Якщо ви хочете зробити справжній тестовий витяг файлу 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*
> /dev/null
для робочого прикладу.
Ви також можете перевірити вміст файлу * .tag.gz, використовуючи pigz
(паралельний gzip) для прискорення перевірки архіву:
pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
Приємним варіантом є використання, 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 $?
Тар сказав, що помилки не було:
0
але файл був пошкоджений, він тепер замість "Pete" має "Fool".
-v
якщо ви просто перекладаєте вихід/dev/null
?