Вопрос или проблема
У меня есть 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
, необходимо устранить вывод сообщений или перенаправить их в другой поток или файл.
Примеры
-
Использование
tee
для фильтрации вывода:
Программаtee
может использоваться для захвата вывода и фильтрации его, сохраняя только необходимые данные.7z e -so archive.7z file.txt | tee
tee
разделяет вывод на два потока, что может быть использовано для анализа данных без вмешательства сообщений. -
Перенаправление ошибок:
В Linux системах перенаправление ошибок с помощью2>/dev/null
позволяет исключить вывод ошибок из общей картины.7z e -so archive.7z file.txt 2>/dev/null
В Windows аналогом будет команда:
7z e -so archive.7z file.txt 2>NUL
-
Использование параметра
-bso0
:
Этот параметр используется для подавления вывода информационных сообщений, что делает команду более чистой для обработки текстовых данных:7z e -bso0 -so archive.7z file.txt
Данная команда обеспечивает, что только сами данные файла
file.txt
будут выведены без каких-либо служебных сообщений.
Применение
Когда требуется извлечь содержимое конкретного файла из архива и передать его в стандартный поток, например, чтобы подать его как ввод в другую программу, вышеуказанные методы становятся незаменимыми. Например, в сложных скриптах автоматизации, где данные из архива обрабатываются сразу по мере извлечения без промежуточного хранения на диске. Такой подход может значительно сократить время обработки и потребность в дисковом пространстве.
Кроме того, использование перенаправления и подавления вывода полезно для упрощения логирования и отладки приложений, работающих в автоматическом режиме и обрабатывающих значительные объемы данных из архивов.
Заключение
Правильное управление выводом командной строки 7-Zip позволяет более гибко и эффективно использовать её в автоматизированных и конвейерных операциях. Описанные методы представляют собой практическое решение для извлечения данных в стандартный вывод, позволяя интеграция 7-Zip в более сложные системы обработки данных.
Система перенаправления потоков и подавления лишней информации в командной строке может стать мощным инструментом в арсенале IT-профессионала, обеспечивая высокую степень контроля над процессом извлечения и обработкой данных из архивов.