витягнути один файл з величезного файлу tgz


19

У мене величезний файл tar (близько 500G), і я не хочу витягти з нього лише один файл.
Однак, коли я запускаю, tar -xvf file.tgz path/to/fileздається, що це все-таки завантажує весь вміст у пам’ять, і на це потрібно більше години. Я також намагався використовувати, --exclude=ignore.txtде ignore.txt - це перелік шаблонів, намагаючись не допустити його марних шляхів, але це, здається, не працює.

Можливо, я не розумію смол ... Чи є спосіб швидкого вилучення файлу?


Мені цікаво те саме. Файл, який я шукаю, знаходить швидко і витягується - і тоді мені потрібно почекати годину, щоб решту досягнень обробити: o (
maasha

Відповіді:


14

На жаль, для того, щоб розпакувати один член .tar.gzархіву, вам доведеться обробити цілий архів, і ви не можете багато чого зробити, щоб виправити його.

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

Ви можете запитати, чому обробка .tar.gzнастільки повільна?

.tar.gz(часто скорочується як .tgz) - це просто .tarархів, стиснений gzipкомпресором. gzip- це потоковий компресор, який може працювати лише з одним файлом. Якщо ви хочете отримати будь-яку частину gzipпотоку, вам доведеться розпакувати його в цілому, і саме це дійсно вбиває його .tar.gz(і для .tar.bz2, .tar.xzі інших подібних форматів, заснованих на .tar).

.tarформат насправді дуже і дуже простий. Це просто потік 512-байтних заголовків файлів чи каталогів (ім'я, розмір тощо), за якими слідує вміст файлу чи каталогу (додається до 512 розміру блоку з 0 байтами, якщо потрібно). Коли ви спостерігаєте за абсолютно нульовим блоком 512 для заголовка, це означає кінець .tarархіву.

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


3
gzip може передавати нестиснені дані, не потрібно це скасовувати. Але, оскільки .tar короткий для стрічкового архіву, вам потрібно пройти весь файл, поки ви не знайдете потрібний файл. Хоча смола продовжуватиме шукати, бо може бути інша, пізніше скопіюйте її у файл tar.
kurtm

9

Якщо ви витягуєте лише один файл з великого файлу tar, ви використовуєте GNU tar, і ви можете гарантувати, що файл tar не буде доданий до цього, ви можете отримати значне підвищення продуктивності, використовуючи --occurrence.

Цей параметр повідомляє tar зупинятися, як тільки він виявляє перше виникнення кожного запитуваного файлу, наприклад,

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

не розмотається через весь тарбол після того, як він знайде по одному примірнику кожного, passwdі shadowнатомість він зупиниться. Якщо ці файли з’являться наприкінці, збільшення продуктивності не буде великим, але якщо вони з’являться навіть на півдорозі через файл 500G, ви заощадите багато часу.

Для людей, які використовують tarрезервні копії для одного знімка та не використовують реальні магнітофони, ця ситуація, мабуть, є типовим випадком.

Зауважте, що ви також можете пройти, --occurrence=NUMBERщоб отримати число NUMBERth кожного файлу, що допоможе, якщо ви знаєте, що в архіві є кілька версій. За замовчуванням поведінка дорівнює NUMBER1.


Чи є спосіб створити tar, щоб першим вийшов конкретний файл? так що --occurrenceвідразу вступить у перший файл? Я здогадуюсь, що мова йде про назви файлів, тому перше, наприклад, вийде щось, що називається aaaaa.jpg?
Джефф

1
@Jeff: Не дуже. Це просто заважає tarпродовжувати шукати в тарболі новіші версії знайденого файлу. Замість цього він повертається, як і говорить людина, the Nth occurrence. Якщо ви вказали один файл для вилучення в командному рядку, і ви скажете, --occurrenceто tar вийде, як тільки знайде цей файл, і таким чином ефективно зупиниться на "першому файлі".
фогг

2

У роботі з великим використанням тарболу:

--fast-readвитягти лише перший запис архіву, який відповідає імені файлів операнду, path/to/fileв цьому випадку - який завжди унікальний у тарболі

tar -xvf file.tgz --fast-read path/to/file

вище буде шукати, поки не знайде збіг, а потім вийде


1
Я хотів зрозуміти, чому це все ще на 0 балів. man tar(GNU tar 1.29) навіть не надрукує цю опцію. Однак, схоже, Ubuntu увімкнено його за замовчуванням . Читаючи швидко, я не впевнений, що --fast-readвідрізняється від --occurrence. Але тоді --occurrenceнавіть немає на сторінці Ubuntu, але вона знаходиться в man tar. Є --fast-readі --occurrenceте ж саме можливо?
Джефф

Жоден із цих параметрів не визначений стандартом, і, як завжди, це стосується нестандартних опцій, слід бути обережним, щоб утиліта вашої системи їх підтримувала. Параметр --occurrences підтримується tar GNU. Опція --fast-read читається на підтримці останніх версій тату FreeBSD, упакованих Ubuntu як bsdtar. Дивіться тут докладніше.
фогг

1

На жаль, формат файлу tar не містить централізованої таблиці вмісту - тому архів потрібно читати послідовно, щоб знайти певний файл. Спочатку він був розроблений для стрічкових резервних копій ( «дьоготь» походить від т мавпи ар резанца), які не підтримали б таку операцію в будь-якому випадку.

Отже, вам, мабуть, доведеться просто почекати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.