LINUX.ORG.RU

Список файлов в архивах внутри архивов внутри архивов

 


0

1

Есть архивы. zip, jar (==zip), 7z, rar, tar.gz, tar.bz2, всё в таком роде. В архивах могут быть архивы в произвольном порядке вложенности.

Я хочу получить список файлов. В общем что-то вроде find . > files.txt. Только этот find должен заглянуть внутрь каждого архива, внутрь каждого архива внутри и тд. Т.е. что-то вроде

./backups/laptop.7z!/Users/Temp/old.rar!/tomcat-7.0/lib/servlet.jar!/javax/servlet/Servlet.class как пример одной из строк того, что долго получиться.

Архивы относительно большие, десятки гигабайтов некоторые. И очень хочется, чтобы оно ничего никуда не распаковывало, а работало исключительно каким-нибудь поточным режимом в памяти, уж не знаю, возможно ли это хотя бы в теории.

Может кто видел такую утилиту или что-то, позволяющее её соорудить.

★★★★★

Последнее исправление: Legioner (всего исправлений: 1)

Для получения списка файлов, содержащихся внутри архива, запакованного в другой архив, вложенный архив нужно распаковать и получить в нём список файлов, а если в нём тоже есть архивы, то и распаковать все их.

Ты можешь сам написать скрипт.

anonymous
()

Напиши рекурсивную функцию, которая на вход будет получать имя архива, определять его тип, получать список файлов. Выделять среди списка файлов архивы и рекурсивно их обрабатывать.

anonymous
()

И очень хочется, чтобы оно ничего никуда не распаковывало

Перехочется. Ты как себе это представляешь вообще?

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

На Java есть понятие потока. Когда ты читаешь в память по 8 КБ (например) и обрабатываешь одновременно. Насколько я знаю, ни один формат архива не требует держать его в памяти целиком. Т.е. технически задача решаема.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

На Java есть понятие потока. Когда ты читаешь в память по 8 КБ (например) и обрабатываешь одновременно

Ничего не обрабатывается «одновременно» затрахаешься контексты тредов переключать быстрее, чем что-то обработаешь.

Насколько я знаю, ни один формат архива не требует держать его в памяти целиком

И какая тебе польза от того, что ты разархивируешь кусок какого-то непонятного архива? Они все разные, какие-то надо перечитывать полностью, чтобы там что-то найти. В итоге ты всё равно должен делать всю или большинство работы по распаковке, только с багами, глюками и траходромом.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

XY problem

zip, jar (==zip), 7z, rar, tar.gz, tar.bz2

Т.е. всё подряд нужно уметь? Что-то я сомневаюсь, что из этого что-то приемлемое получится. Если бы это был строго грутый tar и gzip и bzip2, можно было бы быстренько на бусте скриптик накатать, а так хз даже.

Архивы относительно большие, десятки гигабайтов некоторые

Дикое количество времени будет занимать, может ну его? Или это разово нужно будет выполнить?

Цель-то какая?

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от Legioner

как обычно
делаешь скрыпт, который выводит листинг архива в некоторый файл. если он в листинге находит архив, то из архива найденный архив распаковывается в /run /tmp или что пожелаш. и на этот распакованный архив натравливается скрыпт по листингу архива. … профит

т.е. «чтобы понять что такое итерация надо просто понять что такое итерация».
выполнимость зависит от вложенности и размеров /run /tmp
плюс оптимизации: к примеру для безиндексового tar его можно сразу расжимать, если в нем предполагаются архивы.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: XY problem от WitcherGeralt

Дикое количество времени будет занимать, может ну его? Или это разово нужно будет выполнить?

Разово.

Цель-то какая?

Цель - быстро определить, где есть нужный файл. А то бэкапов и бэкапо-подобных архивов накопилось много, а поиска по ним нет.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Если разово, то я бы сделал tmpfs на 10гб и запустил 2 скрипта, один тупо распаковывает, а второй параллельно делает find в цикле, записывает пути файлов и тут же удаляет.

WitcherGeralt ★★
()
Ответ на: комментарий от Legioner

хех без tmp распаковок будет дольшее и медленнеее, а скрипт сложнеееее…
скрипт должон уметь собрать цепочку разархивирования для произвольного архива внутри архива внутри архива… насколь в глубину хочешь залезть :).

pfg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.