Як витягти конкретні файли (файли) з tar.gz


105

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

$ 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?


Зауважте, що будь-яке рішення спочатку має розпакувати весь архів: superuser.com/questions/655739/… Якщо ви цього хочете уникнути, вам потрібно буде використовувати інший формат, наприклад zip. Однак ZIP надасть меншу компресію, оскільки він стискає окремий файл окремо: superuser.com/questions/1013309/… Цікаво, чи існує формат, який підтримує як швидкість, так і можливість вилучення одного файлу.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Відповіді:


119

Ви також можете використовувати tar -zxvf <tar filename> <file you want to extract>

Ви повинні записати ім'я файлу точно, як tar ztf test.tar.gzпоказано. Якщо він пише, наприклад ./extract11, або some/bunch/of/dirs/extract11, це те, що вам потрібно дати (і файл відобразиться саме під такою назвою, необхідні каталоги створюються автоматично).

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

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Анкіт Вашистха

1
то спробуйте це tar tf archive.tar.gz | grep extract11.дозволіть перевірити, чи Extra11 є в архіві чи ні
harish.venkat

8
Ви повинні записати ім'я файлу точно, як tar ztf test.tar.gzпоказано. Якщо він пише, наприклад ./extract11, або some/bunch/of/dirs/extract11, це те, що вам потрібно дати (і файл відобразиться саме під такою назвою, необхідні каталоги створюються автоматично).
фонбранд

Я хотів би тут додати крапку, -zопція не працює в деяких версіях unix, таких як HP-UX.
Анкіт Вашистха

1
@ pj-brunet: Ні, fне повинно бути в кінці. Але за ним має бути безпосередньо ім'я файлу. Цей приклад з усіма іншими варіантами після імені дьогтю працює відмінно: tar -f mytar.tar.gz -zxv dir/somefile. Він витягує "dir / somefile" з "mytar.tar.gz".
mivk

34

Припустимо, у вас називається тарбол, lotsofdata.tar.gzі ви просто знаєте, що там є один файл, який ви хочете, але все, що ви можете запам’ятати, це те, що його ім’я містить слово contract. У вас є два варіанти:

Використовуйте tarта grepперелічіть вміст тарболу, щоб ви могли дізнатися повний шлях та ім’я будь-яких файлів, які відповідають тій частині, яку ви знаєте, а потім використайте tarдля вилучення одного файлу, тепер ви знаєте його точні дані, або ви можете використовувати два маловідомі перемикачі, щоб просто витягнути всі файли, які відповідають тому, що ви мало знаєте про своє ім’я файлу - для цієї опції вам не потрібно знати повне ім’я або будь-яку частину шляху. Деталі:

Варіант 1

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

Тут відображатиметься інформація про всі файли, імена яких містять вашу відому частину. Потім ви отримуєте те, що ви хочете використовувати:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Вам може знадобитися ./перед вашим шляхом, щоб він працював.

Варіант 2

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

Від вас залежить, що вам здається легшим чи найкориснішим.


Драт. Друкарська помилка цієї останньої команди: я копіював -xzf. Має бути лише один екземпляр цих комутаторів.
Венді Крікс

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>працював для мене без надання ./на початку повного шляху
користувач13107

Можливо, вам доведеться набратися терпіння, зайнявши деякий час ... Також, можливо, це очевидно, але це буде витягнути повну структуру каталогів у поточному каталозі, навіть якщо ці каталоги ще не існують.
PJ Brunet

BSD tar (принаймні на macOS) не підтримує цю --wildcardsопцію. Мені все-таки вдалося отримати подібну поведінку -x -O *foo. *fooв моєму випадку було глобальним іменем файлів, оскільки я знав, що файл закінчується foo.
Ерік Ху

6

На днях я намагався витягнути пару сотень файлів із тарболу з тисячами файлів. На потрібні мені файли не може бути посилання однією підстановою. Тому я погуглив і знайшов цю сторінку.

Однак жоден з вищезазначених хитрощів не здається для мого завдання. Я закінчив прочитати людину і знайшов цей варіант --files-from, тому моє остаточне рішення

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

і це працює як шарм.

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


2

Ваш приклад працює для мене, якщо ви пропустите брекети

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

Якщо ваш витяг файлу11 знаходиться в підпапці, вам слід вказати шлях у тарболі.

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

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Анкіт Вашистха

Тоді виразно extra11 немає у tar-файлі. Будьте впевнені, що вам потрібно надати відносний шлях. Дивіться редагування
Бернхард

1

Нижче наведено приклади вилучення конкретних файлів з файлу 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.