Назад | Перейти на главную страницу

Извлечение одного файла из большого файла tar.gz

У меня невероятно большой архив. Я бы извлек несколько файлов из многих тысяч в архиве. Я использую CentOS 6.10 с GPFS 4.2.3. Я видел из этот ответ Этот pigz полезен для извлечения всего tar.ball. Извлечение всего tar-файла бесполезно, потому что это займет терабайты пространства.

Я пробовал что-то вроде:

$ pigz -dc ../test.tar.gz | tar xf test/analysis/something/dist.txt
tar: test/analysis/something/dist.txt: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Я не совсем уверен, как пройти test/analysis/something/dist.txt в качестве аргумента tar в контексте конвейера вывода pigz. Моя интуиция подсказывает использовать xargs, но это тоже не удается.

$ pigz -dc ../test.tar.gz | xargs -I var | tar xf var test/analysis/something/dist.txt
tar: var: Cannot openxargs: Warning: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?
: No such file or directory
tar: Error is not recoverable: exiting now
xargs: /bin/echo: terminated by signal 13

ВОПРОС

  1. Как быстро извлечь один файл из большого архива с помощью pigz?

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

Правильная команда будет:

$ pigz -dc ../test.tar.gz | tar xf - test/analysis/something/dist.txt
#                                  ^- this dash tells tar to read from stdin

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

Согласитесь с автором выше, просто упомяните о навигации по файлам внутри tar-архива:

pigz -dc <archive.tar.gz> | tar xf - <file-with-path-inside-archive>

попробуйте проверить / просмотреть архив (опция tar -t) для вашего файла:

pigz -dc <archive.tar.gz> | tar tf -

искать полное имя файла в архиве:

pigz -dc <archive.tar.gz> | tar tf - | grep <file-name>