У меня есть большой защищенный паролем архив 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
«Правильна ли эта команда (так как она не работает), и возможно ли вообще выполнить такую вещь, поскольку размер файла превышает оперативную память устройства (16 ГБ)?» в этом заявлении суммирован ваш ответ. Если он превышает имеющуюся у вас память, вы не сможете запустить команду и извлечь ее. вам нужен альтернативный способ его извлечения, по сути, извлечение дважды, каким-то образом управляя пространством на вашем устройстве.
@axiac, там просто написано: «ОШИБКА: невозможно открыть файл как архив E_NOTIMPL». пожалуйста, смотрите ОБНОВЛЕНИЕ для получения дополнительной информации.
@nabinsademba О, не могли бы вы тоже проверить ОБНОВЛЕНИЕ. Я думал, что 7z загружает данные порциями в ОЗУ. Итак, первая часть (7z x OuterArchive.7z -so InnerArchive.7z -ppass1
) передает данные правильно, но не может выполнить вторую часть (после канала), верно?
попробуйте это: mkfifo temp_pipe; 7z x OuterArchive.7z -so -ppass1 > temp_pipe & 7z x -si -ppass2 SomeFile.ext < temp_pipe; rm temp_pipe, что ты получил?
@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
Читая в Интернете 7z, мне неясно, можно ли использовать его для такого эффективного распаковывания потоков памяти. Хотя я бы не стал предполагать, что это невозможно. Я предлагаю вам создать тестовый архив 7z-in-7z с небольшим файлом и убедиться, что вы правильно ввели команду. Я вижу одну вещь: 7z x -si -so
, кажется, устанавливает -so
стандартный вывод, но затем также предоставляет SomeFile.ext
, который кажется избыточным.
@erik258 erik258 Я создал небольшой вложенный архив, та же ошибка. SomeFile.ext
— это имя подфайла для InnerArchive.7z
.
Можете ли вы сжать InnerArchive как InnerArchive.tar.gz?
@Бармар Ты прав.
@Philippe Эти архивы созданы ранее, и у меня нет прямого доступа к InnerArchive.
Вы можете попробовать этот подход.
Создайте фиктивный файл.
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, ты прав, позволь мне копнуть глубже.
Видимо это действие не поддерживается. (ср. 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 ТБ стоит меньше, чем обед в не очень дорогом ресторане.
приятное слежение. Так что 7z не может эффективно работать на потоке
«поскольку это не работает» — помимо отсутствия ожидаемого файла, какие еще симптомы он проявляет? Сообщает ли об ошибке?