Программно извлеките tar.gz за один шаг (в Windows с 7-Zip)

Проблема: я хотел бы иметь возможность извлекать файлы tar.gz за один шаг. Это делает мой вопрос почти идентичным этому: Вопрос о переполнении стека для tar-gz.

Мой вопрос почти тот же, но не тот же, потому что я хотел бы сделать это в Windows, используя командную строку 7-Zip (или что-то подобное) внутри файла bat или Ruby/Perl/Python сценарий.

Вопрос. Эта, казалось бы, простая задача оказывается более сложной, чем может показаться на первый взгляд. У кого-нибудь уже есть скрипт, который это делает?


person dreftymac    schedule 31.08.2009    source источник
comment
Проголосовал за переход на superuser.com, поскольку он не совсем связан с программированием.   -  person Andy White    schedule 01.09.2009
comment
@AndyWhite Поскольку OP хочет сделать это с помощью скрипта bat/ruby/perl/python, а скрипт можно рассматривать как небольшую программу, вопрос связан с программированием.   -  person HelloGoodbye    schedule 31.07.2017


Ответы (5)


7z e example.tar.gz  && 7z x example.tar

Используйте && для объединения двух команд в один шаг. Используйте портативную версию 7-Zip (вам понадобятся только 7z.exe и 7z.dll).

person svandragt    schedule 25.05.2010
comment
Это не совсем один шаг. Сначала он по-прежнему выполняет шаг gzip, оставляя потенциально очень большой файл tar. - person bug; 04.02.2013
comment
см. stackoverflow.com/a/12321558/5612605 (ответ от @senthil), чтобы иметь единственное удобное решение; ) - person Cutton Eye; 14.06.2018

Старый вопрос, но сегодня я боролся с ним, так что вот мой 2c. Инструмент командной строки 7zip «7z.exe» (у меня установлена ​​версия 9.22) может записывать в стандартный вывод и читать из стандартного ввода, поэтому вы можете обойтись без промежуточного файла tar с помощью канала:

7z x "somename.tar.gz" -so | 7z x -aoa -si -ttar -o"somename"

Где:

x     = Extract with full paths command
-so   = write to stdout switch
-si   = read from stdin switch
-aoa  = Overwrite all existing files without prompt.
-ttar = Treat the stdin byte stream as a TAR file
-o    = output directory

См. файл справки (7-zip.chm) в каталоге установки для получения дополнительной информации о командах и переключателях командной строки.

Как отмечено от @zespri powershell будет буферизовать ввод для второго процесса 7z, поэтому может потреблять много памяти, если ваш файл tar большой. то есть:

& 7z x "somename.tar.gz" -so  | & 7z x -aoa -si -ttar -o"somename"

Обходной путь из этого ответа SO, если вы хотите сделать это из powershell, заключается в передаче команд в cmd.exe:

& cmd.exe '/C 7z x "somename.tar.gz" -so | 7z x -aoa -si -ttar -o"somename"'
person user2856    schedule 05.02.2013
comment
совет: если вы запускаете его в Windows, и ваш архив большой, не запускайте его под powershell - он будет всасывать все это в память вместо потоковой передачи. откройте приглашение cmd и запустите его оттуда. - person Andrew Savinykh; 29.11.2014
comment
Это круто. (Обратите внимание, что когда я пробовал это (v15.12), он создал файл tar в рабочем каталоге, но удалил его, когда это было сделано) - person Dave; 27.04.2016
comment
@Dave Дэйв У меня этого не происходит в 15.11. Вы запускали его непосредственно в командной строке cmd или в powershell с обходным путем cmd? - person user2856; 28.04.2016

Используйте порт tar для win32.

tar -xvfz filename.tar.gz
person Byron Whitlock    schedule 31.08.2009
comment
в последнее время вы должны запускать bsdtar вместо tar, но все же отличная идея и проще, чем использование 7zip - person pcnate; 03.10.2019

Поскольку вы просили 7-zip или что-то подобное, я предлагаю альтернативный инструмент, который был написан именно для вашего случая использования.

tartool – это бесплатный инструмент с открытым исходным кодом, созданный с использованием библиотеки .NET SharpZipLib.

Пример команды для извлечения файла .tar.gz / .tgz,

C:\>TarTool.exe D:\sample.tar.gz ./

Отказ от ответственности: я являюсь автором этой утилиты.

person senthil    schedule 07.09.2012

Как видите, 7-Zip не очень хорош в этом. С 2009 года люди запрашивали атомарную операцию tarball. В качестве альтернативы вы можете можно использовать программу Arc. Пример команды:

arc unarchive test.tar.gz
person Steven Penny    schedule 13.01.2021