Чи є там розумніший тар або cpio для ефективного пошуку файлу, що зберігається в архіві?


24

Я використовую tarдля архівації групи дуже великих (декількох ГБ) bz2файлів.

Якщо я використовую tar -tf file.tarдля переліку файлів в архіві, це займе дуже багато часу (~ 10-15 хвилин).

Так само cpio -t < file.cpioпотрібно пройти стільки ж часу, як плюс-мінус кілька секунд.

Відповідно, завантаження файлу з архіву ( tar -xf file.tar myFileOfInterest.bz2наприклад, наприклад) відбувається настільки ж повільно.

Чи є там архівний метод, який зберігає легкодоступний "каталог" з архівом, щоб можна було швидко отримати окремий файл в архіві?

Наприклад, якийсь каталог, який зберігає вказівник на певний байт в архіві, а також розмір файлу, який потрібно отримати (як і будь-які інші особливості файлової системи).

Чи є інструмент (або аргумент до tarчи cpio), який дозволяє ефективно шукати файл в архіві?

Відповіді:


15

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

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

якщо Дар не входить до вашого unix / linux-dist, його можна знайти за адресою:

http://dar.linux.free.fr/


Чи існує спосіб подачі трубопроводу на стандартний вихід? Схоже, існує спосіб зробити архів зі стандартного вводу, але не спосіб (принаймні не безпосередньо) витягнути до стандартного виводу. З документації незрозуміло, чи є спосіб це зробити. Чи знаєте ви, як це може бути досягнуто?
Алекс Рейнольдс

1
ні, не знаю. Я насправді сам не використовую дар ... я просто знаю, що він існує. Я досить задоволений дьогтем, і прагну просто створювати текстові файли з переліком вмісту для великих файлів смоли, які я, можливо, захочу шукати пізніше. це можна зробити одночасно зі створенням архіву tar, використовуючи параметр v двічі (наприклад, "tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt")
cas

10

Ви можете використовувати SquashFS для таких архівів. це є

  • розроблений для доступу з використанням драйвера запобіжників (хоча існує традиційний інтерфейс)
  • стислий (чим більший розмір блоку, тим ефективніше)
  • включені до ядра Linux
  • зберігає UID / GID та час створення
  • знає ендіастичність, тому досить портативний

Єдиний недолік, про який я знаю, - це лише читання.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html


8

Хоча він не зберігає індекс, starвін вважається швидшим, ніж tar. Крім того, він підтримує довші назви файлів і має кращу підтримку атрибутів файлів.

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

Редагувати: Ви також можете поглянути xar. У ньому є заголовок XML, який містить інформацію про файли в архіві.

З вказаної сторінки:

Заголовок XML Xar дозволяє йому містити довільні метадані про файли, що містяться в архіві. На додаток до стандартних метаданих unix, таких як розмір файлу, а також його час модифікації та створення, xar може зберігати інформацію, таку як біти файлів ext2fs та hfs, прапорці Unix, посилання на розширені атрибути, відомості про Mac OS X Finder, Mac OS X ресурс - вилки та хеші файлових даних.


+1, щоб попередити мене про корисний звуковий інструмент, про який я ніколи не чув.
cas

Посилання starвниз ......
Pacerier

5

Торбьорн Равн Андерсер має рацію. GNU tar за замовчуванням створює "видимі" архіви. Але він не використовує цю інформацію, коли читає ці архіви, якщо опція -n не задана. За допомогою опції -n я щойно витягнув 7 Гб файл із архіву 300 ГБ за час, необхідний для читання / запису 7 Гб. Без -н це пройшло більше години і не дало результату.

Я не впевнений, як компресія впливає на це. Мій архів не стискали. Стислі архіви не "піддаються пошуку", оскільки поточний (1,26) GNU-тар знімає стиснення до зовнішньої програми.


відповідно до сторінки tar tar man7.org/linux/man-pages/man1/tar.1.html , GNU tar за замовчуванням використовує шуканий формат під час запису, а якщо архів є шукаючим, буде використовувати його під час читання (для список або витяг). Якщо ви використовуєте гугл GNU і все ще бачите проблему, слід подати звіт про помилку в GNU.
Брайан Мінтон

7
Якщо я прочитав посібник правильно, він ніколи не говорить про те, що він має якийсь індекс, і може перейти до будь-якого файлу в архіві, що відповідає імені файлу. --seek просто означає, що базовий носій є шукаючим, так що коли він читає з самого початку, він може пропускати вміст файлу читання, але він ще повинен читати заголовки запису з самого початку. Це означає, що якщо у вас є архів з файлами 1M, і ви намагаєтеся витягти останній, з --no-search, вам потрібно прочитати вміст усіх файлів; з --seek, вам потрібно лише прочитати заголовки 1M, по одному для кожного файлу, але це все ще надто повільно.
icando

4

Єдиний мені архівний формат, який зберігає індекс, - це ZIP, тому що мені довелося не раз реконструювати зіпсовані індекси.


2

Це не індекс, про який я знаю, але я використовую дамп і відновлення з великими файлами, а навігація по дереву відновлення в інтерактивному режимі для вибору випадкових файлів ДУЖЕ швидко.


2

Ви можете використовувати формат архіву / стиснення 7z (7zip), якщо у вас є доступ до p7zip-fullпакету.

На Ubuntu ви можете використовувати цю команду для її встановлення:

$ sudo apt-get install p7zip-full

Щоб створити архів, який ви можете використовувати, 7z a <archive_name> <file_or_directory>і якщо ви не хочете стискати файли і хочете просто "зберегти" їх як є, ви можете скористатися -mx0параметром типу:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

Потім ви можете витягти файли, використовуючи 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Або ви можете перерахувати індекс архіву, з 7z lяким зручно шукати grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Це також tможливість перевірити цілісність, uдодати / оновити файл до архіву та dвидалити файл.

ВАЖЛИВО
чи НЕ використовувати формат 7zip для Linux файлової системи резервного копіювання , як це не зберігає власника і групу файлів , що містяться.


Для Linux було б чудово 7zip файл tar.
Thorbjørn Ravn Andersen

1

Я вірю, що GNU tar здатний робити те, що ви хочете, але не можу знайти остаточний ресурс, який би це сказав.

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


ZIP - файли можуть рости великими .
Печер'є

1
Якщо я прочитав посібник правильно, він ніколи не говорить про те, що він має якийсь індекс, і може перейти до будь-якого файлу в архіві, що відповідає імені файлу. --seek просто означає, що базовий носій є шукаючим, так що коли він читає з самого початку, він може пропускати вміст файлу читання, але він ще повинен читати заголовки запису з самого початку. Це означає, що якщо у вас є архів з файлами 1M, і ви намагаєтеся витягти останній, з --no-search, вам потрібно прочитати вміст усіх файлів; з --seek, вам потрібно лише прочитати заголовки 1M, по одному для кожного файлу, але це все ще надто повільно.
icando

2
@Pacerier Наскільки я розумію, формат ZIP64 дозволяє створювати дуже великі файли, але оригінальний формат ZIP не дозволяє.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen, Один файл розміром 4 Гб - чувак великий .
Pacerier

3
@Pacerier 4GB не був великим, оскільки ISO ISO DVD вийшли на сцену майже двадцять років тому. В даний час терабайт великий.
олігофрен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.