Извлеките большие вложенные архивы 7z с помощью канала

У меня есть большой защищенный паролем архив 7z, который содержит еще один защищенный паролем архив 7z, структурированный следующим образом:

OuterArchive.7z (200GB)
    └── InnerArchive.7z (200GB)
        ├── SomeFile.ext (1GB)
        └── ...

Размеры архивов очень большие (более 200Гб), и мне не хватает свободного места, чтобы распаковать весь архив в файл. Поэтому я пытаюсь использовать стандартные каналы ввода-вывода для извлечения только запрошенного файла с помощью следующей команды:

7z x OuterArchive.7z -so InnerArchive.7z -ppass1 | 7z x -si -so -ppass2 SomeFile.ext

Правильна ли эта команда (так как она не работает), и возможно ли вообще выполнить такое, поскольку размер файла превышает оперативную память устройства (16 ГБ)?


ОБНОВЛЯТЬ: Вот результат команды:

ERROR: 
Can not open the file as archive

E_NOTIMPL

Вы можете видеть, что первая часть команды работает:

┌──(user㉿dhcppc4)-[~/Desktop/x]
└─$ 7z x OuterArchive.7z -so InnerArchive.7z -ppass1 | head -n 1 | hexdump -C
00000000  37 7a bc af 27 1c 00 04  5f 0f 51 b0 a3 61 2f 29  |7z..'..._.Q..a/)|
00000010  1d 00 00 00 27 00 00 00  00 00 00 00 6f a6 f5 15  |....'.......o...|
00000020  a3 8c 32 aa 06 f8 aa c7  92 b0 42 a1 01 0c 66 a3  |..2.......B...f.|
00000030  77 09 6c c3 f9 da 72 28  20 d0 b6 ac 0b b8 ed fc  |w.l...r( .......|
...

Значит, что-то в этой части не так: 7z x -si -so -ppass2 SomeFile.ext

«поскольку это не работает» — помимо отсутствия ожидаемого файла, какие еще симптомы он проявляет? Сообщает ли об ошибке?

axiac 15.08.2024 15:54

«Правильна ли эта команда (так как она не работает), и возможно ли вообще выполнить такую ​​вещь, поскольку размер файла превышает оперативную память устройства (16 ГБ)?» в этом заявлении суммирован ваш ответ. Если он превышает имеющуюся у вас память, вы не сможете запустить команду и извлечь ее. вам нужен альтернативный способ его извлечения, по сути, извлечение дважды, каким-то образом управляя пространством на вашем устройстве.

nabin sademba 15.08.2024 15:55

@axiac, там просто написано: «ОШИБКА: невозможно открыть файл как архив E_NOTIMPL». пожалуйста, смотрите ОБНОВЛЕНИЕ для получения дополнительной информации.

behrad 15.08.2024 16:14

@nabinsademba О, не могли бы вы тоже проверить ОБНОВЛЕНИЕ. Я думал, что 7z загружает данные порциями в ОЗУ. Итак, первая часть (7z x OuterArchive.7z -so InnerArchive.7z -ppass1) передает данные правильно, но не может выполнить вторую часть (после канала), верно?

behrad 15.08.2024 16:19

попробуйте это: mkfifo temp_pipe; 7z x OuterArchive.7z -so -ppass1 > temp_pipe & 7z x -si -ppass2 SomeFile.ext < temp_pipe; rm temp_pipe, что ты получил?

nabin sademba 15.08.2024 16:28

@nabinsademba , [3] 29609 \ 7z Version \ Extracting archive: ERROR: Can not open the file as archive E_NOTIMPL Can't open as archive: 1 Files: 0 Size:0 Compressed: 0 \ [3] + broken pipe 7z x OuterArchive.7z -so -ppass1 > temp_pipe

behrad 15.08.2024 16:36

Читая в Интернете 7z, мне неясно, можно ли использовать его для такого эффективного распаковывания потоков памяти. Хотя я бы не стал предполагать, что это невозможно. Я предлагаю вам создать тестовый архив 7z-in-7z с небольшим файлом и убедиться, что вы правильно ввели команду. Я вижу одну вещь: 7z x -si -so, кажется, устанавливает -so стандартный вывод, но затем также предоставляет SomeFile.ext, который кажется избыточным.

erik258 15.08.2024 16:41

@erik258 erik258 Я создал небольшой вложенный архив, та же ошибка. SomeFile.ext — это имя подфайла для InnerArchive.7z.

behrad 15.08.2024 16:53

Можете ли вы сжать InnerArchive как InnerArchive.tar.gz?

Philippe 15.08.2024 18:22

@Бармар Ты прав.

behrad 15.08.2024 19:28

@Philippe Эти архивы созданы ранее, и у меня нет прямого доступа к InnerArchive.

behrad 15.08.2024 19:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете попробовать этот подход.

  • Создайте фиктивный файл.

    fallocate -l 1G innerBigFile1

  • Сжать с помощью 7z

    7z a innerBigFile1.7z innerBigFile1

  • Добавьте файл someText.txt в файл InternalBigFile1.7z.

    7z a innerBigFile1.7z someText.txt

  • Добавьте внутреннийBigFile1.7z во внешнийBigFile.7z.

    7z a outerBigFile.7z innerBigFile1.7z

  • Посмотреть внутри архива 7z

    7z l outerBigFile.7z

  • Извлеките someText.txt из outrBigFile.7z, не создавая временный файл из-за нехватки места.

    7z x -so outerBigFile.7z innerBigFile1.7z | 7z x -si -so -y -ttar someText.txt > someTextNew.txt

    • x: Извлечь из архива.

    • -so: извлечь в стандартный вывод

    • -si: ввод со стандартного ввода (вывод первой команды)

    • -у: скажи да!

    • -ttar: принудительно вывести в TAR

Надеюсь, это поможет!

Первая часть (создание файлов) не имела значения, так как я уже пытаюсь извлечь ранее созданный архив, а мои архивы защищены паролем. Но я попробовал вашу последнюю часть ответа следующим образом: 7z x -so OuterArchive.7z InnerArchive.7z -ppass1 | 7z x -si -so -y -ttar -ppass2 SomeFile.ext, который ничего не подсказывает, я не увидел смысла в -ttar, хотя при его удалении появляется та же ошибка.

behrad 15.08.2024 17:09

@behrad, ты прав, позволь мне копнуть глубже.

Prabin Seth 15.08.2024 17:45
Ответ принят как подходящий

Видимо это действие не поддерживается. (ср. E_NOTIMPL).

См.: https://superuser.com/questions/1509609/combined-decryption-and-unzipping-of-a-file

Ответ от Игоря Павлова (создателя 7-zip):

7-zip требует операции «поиска» архивов 7z. Поэтому вы не можете использовать -si для извлечения из архива 7z.

Это было датировано 30 марта 2016 г. Мои тесты и журнал изменений показывают, что это утверждение все еще актуально в 2019 году.


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

Вот некоторые проекты, которые поддерживают это с помощью FUSE:

Использование веб-сервера в качестве помощника:

Использует временные файлы, поэтому, вероятно, бесполезно для варианта использования вопроса:

К старым, возможно, нерабочим проектам относятся:

пс. Лучше инвестировать в внешний диск. Я не знаю, сколько они стоят там, где вы находитесь, но здесь, в Великобритании, твердотельный накопитель емкостью 1 ТБ стоит меньше, чем обед в не очень дорогом ресторане.

jhnc 15.08.2024 19:34

приятное слежение. Так что 7z не может эффективно работать на потоке

erik258 15.08.2024 23:53

Другие вопросы по теме