7zip: как извлечь в стандартный вывод?

Вопрос или проблема

У меня есть 7z версии 4.65, и я пытаюсь извлечь один файл в стандартный поток вывода. Командная строка помощи 7z говорит, что -so — это параметр командной строки для извлечения в стандартный поток вывода, но когда я пытаюсь это сделать:

>>> 7z e -so dist\dlogpkg.jar META-INF/MANIFEST.MF

7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03
Ошибка:
Я не буду выводить данные и сообщения программы в один и тот же терминал

как мне это исправить? Похоже, нет параметра командной строки для подавления обычных сообщений stdout 7z.

(редактирование: аналогичная операция в “unzip” будет

unzip -p dist\dlogpkg.jar META-INF/MANIFEST.MF

что работает нормально. Но я хотел бы использовать 7z по различным причинам.)

передайте это другому инструменту, такому как

  • tee
  • less
  • more

я думаю, что tee ближе всего к тому, что вам нужно; он убирает лишнее от 7z и просто дает содержимое.

% 7z e -so dist\dlogpkg.jar META-INF/MANIFEST.MF | tee

Я также пытался разобраться в этом. Это дало мне то, что я хотел:

7z x -so my_file.zip 2> /dev/null

На Windows, 7z x -so my_file.zip 2> NUL не работает, но перенаправление в реальный файл помогает:

7z x -so my_file.zip 2> _garbage.txt

На Win 10, чтобы избежать лишнего вывода 7z на stdout, я использую опцию -bso0

смотрите справку 7z:

-bs{o|e|p}{0|1|2} : установите поток для вывода/ошибок/строки прогресса

для обработки вывода 7z в командном скрипте cmd.exe, работающем с текстовыми файлами:

 for /f "usebackq tokens=*" %%a in ( `7z e -bso0 -so infile.7z fileToExtract.txt` ) do ( 
  rem обработать %%a текстовую строку
 )

.

Ответ или решение

При извлечении файлов из архивов с использованием командной строки 7-Zip, одной из популярных программ для работы с архивами, пользователям часто требуется извлечение содержимого непосредственно в стандартный вывод (stdout). Этот метод особенно полезен, когда необходимо обрабатывать данные в конвейере команд или непосредственно без промежуточного сохранения на диск.

Теория

Командная строка 7-Zip предоставляет множество возможностей для работы с архивами, включая извлечение данных. Ключевой параметр в данном случае — -so, который указывает программе 7-Zip выводить содержимое на стандартный поток вывода. Однако существует особенность: стандартный поток вывода часто используется как для данных, так и для сообщений о выполнении программы, что может привести к несовместимости выводов.

Классическое использование 7-Zip с параметром командной строки может выглядеть следующим образом:

7z e -so archive.7z file.txt

Проблема, с которой сталкиваются многие пользователи, заключается в том, что сообщения 7-Zip и данные выводятся в один поток, приводя к потенциальным конфликтам и ошибкам, такими как "I won’t write data and program’s messages to same terminal". Чтобы корректно использовать -so, необходимо устранить вывод сообщений или перенаправить их в другой поток или файл.

Примеры

  1. Использование tee для фильтрации вывода:
    Программа tee может использоваться для захвата вывода и фильтрации его, сохраняя только необходимые данные.

    7z e -so archive.7z file.txt | tee

    tee разделяет вывод на два потока, что может быть использовано для анализа данных без вмешательства сообщений.

  2. Перенаправление ошибок:
    В Linux системах перенаправление ошибок с помощью 2>/dev/null позволяет исключить вывод ошибок из общей картины.

    7z e -so archive.7z file.txt 2>/dev/null

    В Windows аналогом будет команда:

    7z e -so archive.7z file.txt 2>NUL
  3. Использование параметра -bso0:
    Этот параметр используется для подавления вывода информационных сообщений, что делает команду более чистой для обработки текстовых данных:

    7z e -bso0 -so archive.7z file.txt

    Данная команда обеспечивает, что только сами данные файла file.txt будут выведены без каких-либо служебных сообщений.

Применение

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

Кроме того, использование перенаправления и подавления вывода полезно для упрощения логирования и отладки приложений, работающих в автоматическом режиме и обрабатывающих значительные объемы данных из архивов.

Заключение

Правильное управление выводом командной строки 7-Zip позволяет более гибко и эффективно использовать её в автоматизированных и конвейерных операциях. Описанные методы представляют собой практическое решение для извлечения данных в стандартный вывод, позволяя интеграция 7-Zip в более сложные системы обработки данных.

Система перенаправления потоков и подавления лишней информации в командной строке может стать мощным инструментом в арсенале IT-профессионала, обеспечивая высокую степень контроля над процессом извлечения и обработкой данных из архивов.

Оцените материал
Добавить комментарий

Капча загружается...