Можно ли заставить распаковать или какие-нибудь аналогичные программы работать на стандартном выходе? Ситуация такова, что я загружаю zip-файл, который должен быть распакован на лету.
Проблема, связанная с данной: Как передать загруженный файл на стандартный вывод в bash?
linux
ubuntu
pipe
compression
Alex
источник
источник
Ответы:
Хотя zip-файл на самом деле является контейнерным форматом, нет никаких причин, по которым его нельзя прочитать из канала (stdin), если файл достаточно легко помещается в память. Вот скрипт Python, который принимает zip-файл в качестве стандартного ввода и извлекает содержимое в текущий каталог или в указанный каталог, если он указан.
Этот скрипт может быть сведен к одной строке и создан как псевдоним.
Теперь легко распакуйте вывод wget.
источник
.read()
методЭто вряд ли сработает так, как вы ожидаете. Zip - это не просто формат сжатия, но и формат контейнера. Он объединяет задания tar и gzip.bzip2 в одно целое. Тем не менее, если ваш zip-файл содержит один файл, вы можете использовать unzip -p для распаковки файлов в stdout. Если у вас есть более одного файла, вы не сможете сказать, где они начинаются и останавливаются.
Что касается чтения из stdin, на странице руководства по разархивированию есть следующее предложение:
Возможно, вам повезет с funzip.
источник
То, что вы хотите сделать, это сделать, чтобы
unzip
взять ZIP-файл на его стандартный ввод, а не в качестве аргумента. Это, как правило , легко поддерживаетсяgzip
иtar
вид инструментов с-
аргументом. Но стандартunzip
этого не делает (хотя поддерживает извлечение в трубу). Однако еще не все потеряно ...Посмотрите на странице руководства funzip .
Это хорошо согласуется с идеей о том, что большинство Linux-архивов обычно обрабатываются TAR, а затем каким-то образом ZIP-архивом (gzip, bzip и др.). Это будет работать для вас, если у вас есть
tar.ZIP
.Стоит отметить, что
funzip
автор Info-ZIP написал оригинальный автор Марк Адлер. Он пишет на странице руководства funzip:однако такого обновления не наблюдается. Я подозреваю, что Марк посчитал это ненужным, поскольку другие методы архивации легко работали с TAR.
источник
Мне нравится использовать curl, потому что он установлен по умолчанию (
-L
необходим для редиректов, которые часто происходят):Однако
bsdtar
по умолчанию не устанавливается, и я не смог приступитьfunzip
к работе.источник
Это перепост моего ответа на похожий вопрос:
Формат файла ZIP включает в себя каталог (индекс) в конце архива. В этом каталоге указывается, где в архиве находится каждый файл, и, таким образом, обеспечивается быстрый произвольный доступ без чтения всего архива.
Это может создать проблему при попытке чтения ZIP-архива через канал, поскольку доступ к индексу не осуществляется до самого конца, и поэтому отдельные элементы не могут быть правильно извлечены до тех пор, пока файл не будет полностью прочитан и больше не доступен , Таким образом, неудивительно, что большинство декомпрессоров ZIP просто терпят неудачу, когда архив подается по каналу.
Каталог в конце архива - не единственное место, где метаинформация файла хранится в архиве. Кроме того, отдельные записи также включают эту информацию в локальный заголовок файла для целей резервирования.
Хотя не каждый ZIP-распаковщик будет использовать локальные заголовки файлов, когда индекс недоступен, внешние интерфейсы tar и cpio для libarchive (также известные как bsdtar и bsdcpio) могут и будут делать это при чтении через канал, что означает следующее:
источник
Это невозможно с Info-Zip, который является наиболее распространенной реализацией OSS. Что еще более важно, это не рекомендуется из-за конструкции архивов ZIP.
Если вам необходимо изменить формат, рассмотрите возможность использования tar (1). Он вполне доволен потоковым вводом / выводом и, по сути, ожидает его по умолчанию.
Кроме того, вы часто можете определить, ожидают ли приложения потокового ввода / вывода, указав «-» для имени файла. Info-Zip, как вы можете себе представить, не воспринимает это как веский аргумент.
источник
В zsh вы можете сделать следующее:
источник
Простейшая распространенная утилита, которая сделает это
jar
, будет предполагать, что STDIN используется, если вы не передадите ей аргументы файла. Он также принимает аргументы, аналогичныеtar
программе для операций.например, список содержимого архива
curl https://my.example.com/file.zip | jar t
Хотя Java не всегда устанавливается, на тех машинах, где она есть,
jar
это определенно самый удобный способ сделать это.источник
Репост моего ответа :
BusyBox
unzip
может взять stdin и извлечь все файлы.Тире после
unzip
- использовать stdin в качестве входных данных.Вы можете даже,
Но это просто избыточно
unzip file.zip
.Если ваш дистрибутив по умолчанию использует BusyBox (например, Alpine), просто запустите
unzip -
.источник
Мне действительно нужно что-то более сложное - извлечь конкретный файл, если он существует. Сложность в том, что поток входного файла может быть не zip-файлом, и в этом случае мне нужно было продолжить через канал. Вот мое решение (в основном благодаря решению Джейсона Р. Кумбса)
Я сохранил это как файл с именем «effpoptp» (не простое имя) в папке «/ bin» на моей машине, поэтому тестирование это выглядит так:
Цель состоит в том, чтобы управлять версиями файлов MySQL Workbench, где файл может быть файлом XML, названным как файл рабочей среды, или полным файлом рабочей среды.
источник