1

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

У меня есть несколько идей о том, как это сделать:

Тем не менее, в идеале, я хотел бы продолжать использовать tar для этого, поскольку это знакомый, де-факто инструмент для архивирования, где я работаю. У tar есть ключ --to-command , который позволяет передавать извлеченные файлы в программу. Если бы у меня была симметричная команда, такая как --from-command я бы легко реализовал свое желание с помощью:

tar cf my_archive.tar file1 file2 --from-command=gzip
tar xf my_archive.tar --to-command=gunzip

Моя мотивация исходит от работы с архивами, содержащими большое количество больших файлов. Я в настоящее время tar-gzip их, но затем извлечение любых файлов из архива занимает много времени - он должен быть распакован, прежде чем tar сможет получить доступ к файлу, и это происходит в последовательном порядке!

Итак, вот мои вопросы:

  • Есть ли очевидный способ добиться этого, который я игнорирую?
  • Кто-нибудь уже написал инструмент для работы, особенно с tar?
  • Если бы вы назвали tar и gzip и стандартные методы архивирования и сжатия в Linux, то каким был бы эквивалентный, популярный метод архивации с сжатием в порядке, о котором я упоминал (то есть, не tar.gz)
  • Есть ли другой способ, который я упускаю, чтобы обойти большое количество времени, которое требуется для извлечения файла из большого архива tar-gzip?

Спасибо!

РЕДАКТИРОВАТЬ

Я понимаю, что мне нужно перефразировать и уточнить мой вопрос. Тем более что, как отметил Робин Гуд, существуют довольно простые решения для создания сжатых архивов (а именно, zip). Итак, вот оно:

Есть ли способ использовать tar который обеспечивает истинный произвольный доступ к архиву, сохраняя его сжатым? Если нет, есть ли другое tar замещение для Linux (которое построено с тем же обоснованием и, в идеале, с поддержкой тех же параметров командной строки), которое достигает этого?

Прямо сейчас я могу заменить tar в общем смысле на zip , изменив:

tar c path/to/file1 path/to/file2 | gzip > arc.tar.gz
gunzip < arc.tar.gz | tar x

чтобы:

zip -qr - path/to/file1 path/to/file2 > arc.zip
unzip -qoX test.zip

Однако это имеет тот недостаток, что он не поддерживает все параметры, которые tar использует для архивирования, а именно:

  1. конвейерная передача каждого извлеченного файла по отдельности в конвейер (ключ --to-command )
  2. unzip не принимает архив при стандартном вводе. funzip , однако, - он выводит только первый файл в архиве

Так что это довольно ограниченно.

Еще раз спасибо!

2 ответа2

1

Я прочитал ваш вопрос несколько раз, это очень трудно понять, но я думаю, что получил его сейчас. Вы хотите, чтобы файлы помещались в отдельные архивы tar, а затем все хранились в одном архиве gz. Это не сработает, потому что архивы gz поддерживают сжатие только 1 файла, поэтому люди сжимают файлы перед сжатием с помощью gz. Вы можете сделать обратное, поместить каждый файл в архив gz, а затем поместить все архивы gz в один архив tar. Кроме того, вы можете просто перестать использовать форматы, которые требуют двойного архивирования, и использовать формат архива, который поддерживает несколько файлов, например zip.

Сжатие файлов внутри tar все равно приведет к последовательному доступу к архивам gz, потому что формат tar не поддерживает произвольный доступ. Zip-архивы используют централизованные каталоги, поэтому произвольный доступ к файлам возможен без распаковки или чтения всего архива. Я не занимаюсь архивированием в Linux, но в Windows мне нравится использовать 7-zip для создания zip-архивов со сжатием lzma. Стоит отметить, что любой из этих методов при использовании со сжатием, сопоставимым с вашим tar.gz, даст больший архив из-за отсутствия твердого сжатия, поэтому tar.gz очень популярен в мире Linux по сравнению с zip для распространения программного обеспечения. ,

Создайте серию архивов GZ и сохраните их в архиве Tar:

cp -a -n -v "/home/me/example/inputfiles/." --target-каталог = "/ главная / мне / пример / gzfiles"

Это скопирует файлы, которые вы хотите архивировать, в другую папку. Gunzip не позволяет хранить исходные неархивированные файлы, но работа с копией позволит вам избежать этого.

gzip -9 "/home/me/example/gzfiles/*"

Это создаст отдельный архив gz для каждого файла и будет использовать максимальное сжатие. Если ваша система не может справиться с этим, попробуйте меньшее число; по умолчанию номер 6.

tar -cf "/home/me/example/tar/archive.tar" -C "/home/me/example/gzfiles."

Это создаст один архив tar, который содержит все архивы gz.

Извлечь один файл из архива GZ в архив Tar:

sudo apt-get установить archivemount

Это установит архивирование, инструмент, который может монтировать файлы tar в каталог.

archivemount -o только для чтения "/home/me/example/tar/archive.tar" "/home/me/example/mount"

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

gunzip -c "/home/me/example/mount/example1.txt.gz"> "/home/me/example/extract1/example1.txt"

Это позволит извлечь файл. Gunzip поддерживает только извлечение в исходный каталог или в стандартный вывод, поэтому в этой команде мы использовали стандартный вывод, а затем передали вывод в файл.

sudo umount "/home/me/example/mount"

Это размонтирует tar-архив.

Извлечь все файлы из серии архивов GZ в архив Tar:

cd "/home/me/example/extractall"

Это помещает терминал в каталог, в который вы хотите извлечь, так как tar извлекает в текущий каталог.

tar -xf /home/me/example/tar/archive.tar

Это извлекает архивы gz.

gunzip * .gz

Это извлекает содержимое архивов gz в текущий каталог /home/me/example/extractall/ и удаляет архивы gz.

Создать ZIP архив:

cd "/home/me/example/inputfiles"

Это помещает терминал в каталог inputfiles, поскольку zip создает архив из текущего каталога и сохраняет его в нем.

zip -9 -r inputfiles inputfiles.zip *

Это создаст zip-архив всего содержимого каталога inputfiles, за исключением скрытых файлов, и будет использовать максимальное сжатие. p7-zip будет лучшим инструментом для использования, если вам нужно высокое сжатие.

mv "/home/me/example/inputfiles/inputfiles.zip" "/home/me/example/zip/archive.zip"

Это позволит вам переименовать архив как угодно и переместить его туда, куда вы хотите.

Извлечь ZIP архив:

cd "/home/me/example/zip"

Это помещает терминал в каталог, содержащий zip.

распаковать -n архив.zip

Это извлекает содержимое zip-архивов в текущий каталог.

1

Если вам нужны индивидуально сжатые файлы в архиве с произвольным доступом, то dar ("Disk ARchive") может быть тем, что вы ищете. Более новые версии поддерживают сжатие LZMA, алгоритм, используемый 7-Zip. Также возможно определить фильтры для хранения некоторых типов файлов без сжатия и экономии времени, например, медиа-файлы и архивы, которые уже имеют свое собственное сжатие. Моя любимая функция - это сжатие существующих (несжатых) архивов, чтобы я мог быстро сделать резервную копию и запустить интенсивное сжатие LZMA с ЦП в более удобное время или на более мощной машине:

dar --empty-dir \
  --fs-root /home \
  --create home-backup-2016-01-11 \
  --prune lost+found

А потом и / или в другом месте:

dar -+ home-backup-2016-01-11-compressed-encrypted \
  -A home-backup-2016-01-11 \
  -zxz:6 \
  -K "aes:" \
  -an -ag -Z "*.mpg" -Z "*.avi" -Z "*.flac" -Z "*.cr2" \
  -Z "*.vob" -Z "*.jpg" -Z "*.jpeg" -Z "*.mpeg" -Z "*.png" \
  -Z "*.mp3" -Z "*.ogg" -Z "*.deb" -Z "*.tgz" -Z "*.tbz2" \
  -Z "*.rpm" -Z "*.xpi" -Z "*.run" -Z "*.sis" -Z "*.gz" \
  -Z "*.Z" -Z "*.bz2" -Z "*.zip" -Z "*.jar" -Z "*.rar" \
  -Z "*.xz" -Z "*.dar" -Z "*.7z" -acase

Как показано выше, шифрование также возможно, все еще позволяя извлекать отдельные файлы. Однако dar, похоже, не имеет эквивалента --to-command . По вашему вопросу трудно сказать, собирались ли вы использовать эту функцию ни для чего, кроме декомпрессии.

(Да, я знаю, что этот вопрос старый. Это для людей, которые, как и я, погуглили "tar tar индивидуально" и получили это как первый результат.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .