Задать вопрос
@Drovosek01

Есть ли утилита для упаковки папки с файлами в несколько архивов, без разделения файлов на части?

Есть директория, в которой находятся файлы и другие директории и в них тоже файлы и другие директории...

Есть необходимость эту "корневую папку" сжать в несколько архивов (.zip или .7z или .rar - без разницы) так, чтобы файлы не делились на части.
То есть получившиеся архивы могут быть самодостаточными и внутри хранить только цельные файлы.
Разумеется ни о каком одинаковом размере архивов речи не идет.

Суть в том, что эта "корневая папка" имеет порядочный размер и хочется упаковать ее частями и поместить в облако.
При этом чтобы для распаковки не обязательно было сначала скачать все "части архива", и только потом начинать распаковку (все части тоже будут весить порядочно),
а чтобы можно было скачать архивы в любом порядке и распаковать сразу после скачивания, не дожидаясь скачивания других архивов...
Вероятно при распаковке 2-го и других архивов в целевую папку - файловый менеджер будет спрашивать про замену папок или слияние, но каждый архив будет иметь только уникальные файлы и поэтому при слиянии папок не будет никаких замен файлов, просто перемещение файлов из архивов в соответствующую структуру папок.

===

Наверняка кто-то уже задавался идеей сделать такой "алгоритм упаковки по самодостаточным частям".
Если да - подскажите, пожалуйста, ссылки на утилиты, которые такое делают

===

Попробую объяснить на конкретном примере:

Попробую объяснить свою мысль на конкретном примере:
Подробный пример

Есть торрент раздача аудио библиотек от компании Spectrasonics.
Весь контент раздачи весит примерно 188 ГБ и представляет собой папку "Spectrasonics" с вложенными папками и файлами.

Если я хочу этот контент загрузить в облако - как я могу поступить?
Очевидные варианты:
1. Всю корневую папку запаковать в zip или rar или 7z архив или в iso-файл, например получить "Spectrasonics.zip"
проблемы:
- полученный архив/образ будет весить более 150 ГБ
- загружать файл размером 150 ГБ в облако долго и если соединение прервется - придется загружать заново
- скачивать файл размером 150 ГБ тоже долго и не надежно
- чтобы получить готовый контент на своем диске должно быть как минимум x2 свободного места от размера архива/образа (то есть должно быть место для скачивания/размещения самого архива и место для распаковки)
2. Всю корневую папку запаковать в zip или rar или 7z архив с разбиением на части, например по 5 ГБ.
Если это будет сделано с помощью WinRar, то получим ряд файлов - "Spectrasonics.part01.rar", "Spectrasonics.part02.rar" и т.д.
проблемы:
- чтобы начать распаковывать - необходимо скачать все части архива
- чтобы получить готовый контент на своем диске должно быть как минимум x2 свободного места от размера всех частей (то есть должно быть место для скачивания/размещения самого архива и место для распаковки)

Что я хочу:
Утилиту, которая создаст архивы, с именами, например "Spectrasonics part 1.zip", "Spectrasonics part 2.zip", "Spectrasonics part 3.zip" и т.д.
Все эти архивы - обычные архивы, а не части архива, то есть в них находятся цельные файлы и скачав любой из этих архивов можно его распаковать, удалить и скачивать следующий.
Все эти архивы части 1 большой папки с контентом "Spectrasonics"
проблемы:
проблема может возникнуть только при ручном слиянии папок, потому что в каждом архиве будет примерно одинаковая структура/иерархия папок, но разные файлы в конечных папках
  • Вопрос задан
  • 2692 просмотра
Подписаться 3 Простой 9 комментариев
Пригласить эксперта
Ответы на вопрос 6
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Проблема явно высосана из пальца.
Если нужны "самодостаточные архивы", то и запаковывать надо по файлам/папкам, а не вот это вот мракобесие. В общем случае проходим по папкам и архивируем каждую

for i in */; do zip -r "${i%/}.zip" "$i"; done

В данном конкретном случае 99% объема раздачи составляют файлы .db. Вот их и надо заархивировать, по отдельности. А всё остальное оставить как есть. И тогда этим "облаком" можно будет хоть как-то пользоваться, без нанайских национальных плясок, распаковывая по 10 чемоданов, чтобы достать один файл.
find . -type f -name '*.db' -exec zip -m {}.zip {} \;

В винде всё это тоже легко пишется.

Но сначала надо оценить саму необходимость возиться с архивирванием, чтобы сэкономить 30 гигов из 180.
Ответ написан
2ord
@2ord
Очевидные варианты:
...
- чтобы начать распаковывать - необходимо скачать все части архива
нет. Нужны только те тома, которые содержат нужные файлы. Каждый том ZIP содержит так называемую центральную директорию (ЦД) со списком файлов в нем и можно узнать где файл, просмотрев список. Тогда если нужный файл будет присутствовать в двух томах, то достаточно скачать лишь архивы этих двух томов.
Более того, если можно примонтировать облачное хранилище как директорию, с возможностью случайного доступа внутри архива, то ЦД позволит архиватору знать по какому смещению находится извлекаемый файл и таким образом, с минимальным трафиком, распаковать лишь его.
Ответ написан
@StarJohn
Если в руководствах архиваторов действительно не гуглится опция "Не разделять файл в разные тома архива", то, мне кажется, имеет смысл написать хотя бы создателям WinRar и 7zip, чтоб такую опцию добавили (у них в последнее время идей по развитию не очень много, почти все реально полезное уже реализовали, вашу идею могут воспринять с интересом - тем более, что сам формат архива не меняется, только алгоритм упаковки).
Ответ написан
Комментировать
@RedBuld
Ответ прост, zip + splitzip дадут ва то что нужно, но в процессе потребуется 2x свободного места от размера архивируемых файлов
Ответ написан
@forester22
В ТоталКомандер во встроенном упаковщике (АльтФ5 или АльтФ9) есть галочка "Каждый файл/папку в отдельный архив"
Ответ написан
@oleg__frolov
Такое точно было в каком то архиваторе, я раньше так жал файлы. Кажется это было в arj

Upd
Точно, arj -hs
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы