Я нашел вопрос, как определить, являются ли данные действительным файлом tar без файла? , но мне было интересно: есть ли готовое решение для командной строки?
Я нашел вопрос, как определить, являются ли данные действительным файлом tar без файла? , но мне было интересно: есть ли готовое решение для командной строки?
Ответы:
Как насчет того, чтобы просто получить листинг архива и выбросить результат, а не распаковывать файл?
tar -tzf my_tar.tar.gz >/dev/null
Отредактировано согласно комментарию. Спасибо, зрайм!
Отредактируйте согласно комментарию. Спасибо Frozen Flame! Этот тест никоим образом не подразумевает целостность данных. Поскольку он был разработан как архиватор на магнитной ленте, большинство реализаций tar допускают создание нескольких копий одного и того же файла!
-z
Опция также ненужная. Он ничего не делает в режиме извлечения или списка.
-z
Это определенно относится к GNU tar - знаете ли вы, верно ли это в других местах (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
(parallel 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 (IDentification 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
но файл был поврежден, теперь в нем "Дурак" вместо "Пит".
-v
если вы просто подключаете вывод/dev/null
?