- Вопрос или проблема
- Ответ или решение
- 1. Проверка содержимого архива
- 2. Извлечение конкретного файла
- 3. Извлечение файлов по шаблону
- Вариант 1: Использование grep
- Вариант 2: Использование шаблонов
- 4. Извлечение множества файлов
- 5. Извлечение из удаленных источников
- 6. Общие ошибки и рекомендации
- Ошибка: Файл не найден
- Соображения по производительности
- Заключение
Вопрос или проблема
Как мы можем извлечь конкретные файлы из большого 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
может показаться сложным на первый взгляд, но при правильном подходе это достаточно просто. Запомните основные команды, которые были описаны выше, и обязательно проверьте содержимое архива перед извлечением. Это позволит вам избежать ошибок и сэкономить время при работе с большими объемами данных.