Как извлечь конкретные файлы из tar.gz

Вопрос или проблема

Как мы можем извлечь конкретные файлы из большого tar.gz файла? Я нашел процесс извлечения файлов из tar в этом вопросе, но когда я попытался выполнить упомянутую команду, я получил ошибку:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Как мне тогда извлечь файл из tar.gz?

Перечислите пути в tar:

tar -ztf test.tar.gz

Запишите имя файла / путь точно так, как они указаны. например, если указано ./extract11 или some/bunch/of/dirs/extract11, это то, что вам нужно использовать.

Вы можете извлечь этот файл в таком формате:

tar -zxvf <имя tar файла> <файл, который вы хотите извлечь>

Файл будет отображаться под именно таким названием, недостающие директории создаются автоматически.


Используемые параметры:

  • -z: фильтрует архив через gzip, используется для распаковки .gz файлов.
  • -t: перечислить содержимое архива
  • -x: указывает tar извлечь файлы.
  • -v: Подробно (показывает прогресс во время извлечения файлов).
  • -f: задает имя файла / имя tarball.

Предположим, у вас есть tarball под названием lotsofdata.tar.gz, и вы просто знаете, что там есть один файл, который вам нужен, но единственное, что вы можете запомнить, это то, что в его имени содержится слово contract. У вас есть два варианта:

Либо используйте tar и grep, чтобы перечислить содержимое вашего tarball, чтобы вы могли узнать полный путь и имя любых файлов, которые соответствуют известной части, а затем используйте tar, чтобы извлечь этот один файл, когда вы знаете его точные данные, либо вы можете использовать два малоизвестных переключателя, чтобы просто извлечь все файлы, которые соответствуют тому, что вы знаете о имени файла — вам не нужно знать полное имя или любую часть его пути для этого варианта. Подробности следующие:

Вариант 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Это перечислит детали всех файлов, имена которых содержат вашу известную часть. Затем вы извлекаете то, что хотите, используя:

$ tar -xzf lotsofdata.tar.gz <полный путь и имя файла из вашего списка выше>

Вам может понадобиться ./ перед вашим путем, чтобы это сработало.

Вариант 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

На днях я пытался извлечь несколько сотен файлов из tarball с тысячами файлов. Файлы, которые мне нужны, не могут быть указаны с помощью одного шаблона. Поэтому я загуглил и нашел эту страницу.

Тем не менее, ни один из вышеуказанных трюков не подходит для моей задачи. В конечном итоге я прочитал man, и нашел эту опцию --files-from, так что моё окончательное решение:

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

и это работает отлично.

Обновление: Файл списка должен иметь такой же формат, как вы бы увидели из tar -tvf, в противном случае вы не сможете извлечь никакие файлы.

Пожалуйста, посмотрите ниже примеры извлечения конкретных файлов из tar.gz файла.

Из локального файла:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Из удаленного URL:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt

Ваш пример сработал для меня, если вы пропустите фигурные скобки:

$ tar --extract --file=test.tar.gz extract11

Если ваш файл extract11 находится в подпапке, вы должны указать путь внутри tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11

Чтобы извлечь только файлы, соответствующие определенному шаблону:

for i in $(tar ztf test.tar.gz | grep 2021-01); do tar -xzvf test.tar.gz $i; done

Для нескольких шаблонов:

for i in $(tar ztf test.tar.gz | egrep '2021-01|2021-02|2021-03'); do tar -xzvf test.tar.gz $i; done

чтобы извлечь только некоторые файлы из большого архива, используйте bsdtar --fast-read от libarchive

пример:

$ du -sh chromium-124.0.6367.60.tar.zstd
2.2G    chromium-124.0.6367.60.tar.zstd

$ time bsdtar --fast-read -x -f chromium-124.0.6367.60.tar.zstd -- source/DEPS

real    0m0.034s

в этом случае это быстро, потому что файл находится в начале архива,
и с --fast-read извлекается только первое совпадение

$ tar tf chromium-124.0.6367.60.tar.zstd | grep -n -m1 source/DEPS
20:source/DEPS

gnu tar не имеет опции fast-read, он всегда будет просматривать весь архив

Ответ или решение

Извлечение конкретных файлов из архива tar.gz — это задача, с которой сталкиваются многие специалисты в области информационных технологий. Архивы данного формата часто применяются для хранения больших объемов данных, поэтому важно знать, как эффективно извлекать из них лишь нужные файлы. В этой статье мы подробно рассмотрим процесс извлечения конкретных файлов из архива tar.gz, приведем примеры команд и объясним, как избежать распространенных ошибок.

1. Проверка содержимого архива

Прежде чем начинать извлечение, полезно сначала просмотреть содержимое архива. Для этого используется команда:

tar -ztf test.tar.gz

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

2. Извлечение конкретного файла

Чтобы извлечь определенный файл, используйте следующую команду:

tar -zxvf test.tar.gz путь/к/файлу

Здесь:

  • -z — указывает на необходимость распаковки gzip.
  • -x — команда для извлечения файлов.
  • -v — выводит процесс извлечения в терминал (verbose).
  • -f — указывает имя архива.

Пример извлечения файла extract11, который находится в подкаталоге subfolder, будет выглядеть так:

tar -zxvf test.tar.gz subfolder/extract11

3. Извлечение файлов по шаблону

Если вам нужно извлечь файлы, имена которых содержат определенное слово или шаблон, можно использовать команды grep и tar:

Вариант 1: Использование grep

Сначала просмотрите содержимое архива и отфильтруйте нужные файлы:

tar -tzf lotsofdata.tar.gz | grep contract

После этого извлеките нужный файл, используя полученный путь:

tar -xzf lotsofdata.tar.gz полный/путь/к/файлу

Вариант 2: Использование шаблонов

Если вам нужно извлечь файлы, соответствующие шаблону, используйте опции --wildcards и --no-anchored:

tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

4. Извлечение множества файлов

Для извлечения нескольких файлов сразу можно использовать файл-список. Сначала создайте файл, в котором перечислены все необходимые пути к файлам, аналогично тому, как выводится результат команды tar -tvf. Затем выполните команду:

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

5. Извлечение из удаленных источников

Если архив доступен по сети, вы можете использовать curl:

curl -s http://example.com/file.tgz | tar xvf - путь/к/файлу

6. Общие ошибки и рекомендации

Ошибка: Файл не найден

При выполнении команды можно столкнуться с ошибкой:

tar: {test.tar.gz}: Cannot open: No such file or directory

Это означает, что файл с указанным именем не существует. Убедитесь, что вы используете правильный синтаксис, избегая фигурных скобок:

tar --extract --file=test.tar.gz extract11

Соображения по производительности

Если архив очень большой, и вы знаете, что нужный файл находится в его начале, рассмотрите использование bsdtar с опцией --fast-read, которая позволяет быстро извлечь файл без полного сканирования архива:

bsdtar --fast-read -x -f yourfile.tar.gz -- путь/к/файлу

Заключение

Извлечение файлов из архива tar.gz может показаться сложным на первый взгляд, но при правильном подходе это достаточно просто. Запомните основные команды, которые были описаны выше, и обязательно проверьте содержимое архива перед извлечением. Это позволит вам избежать ошибок и сэкономить время при работе с большими объемами данных.

Оцените материал
Добавить комментарий

Капча загружается...