Извлечь только определенный файл из архива в заданный каталог

152

Мне нужно извлечь один файл из ZIP-файла, путь к которому я знаю. Есть ли такая команда:

unzip -d . myarchive.zip path/to/zipped/file.txt

К сожалению, приведенная выше команда извлекает и воссоздает полный путь к файлу в ./path/to/zipped/file.txt. Есть ли способ для меня, чтобы просто вытащить файл в указанный каталог?

Нафтули Кей
источник

Ответы:

130

Вы можете извлечь только текст в стандартный вывод с помощью -pопции:

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

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

В качестве альтернативы, смонтируйте архив как каталог и просто скопируйте файл. С AVFS :

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

Или с предохранителем на молнии :

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d
жилль
источник
2
@TK Кочеран: Почему бы тебе просто не проверить это? Я проверил первую команду, и она сработала.
пользователь неизвестен
1
@TKKocheran: Jar-файлы - это zips, поэтому методы unzip и fuse-zip, очевидно, будут работать. Метод AVFS также работает, потому что AVFS определяет формат на основе имен файлов и знает о них .jar; если ваш файл имеет другое имя, вам может потребоваться указать AVFS использовать его zip-обработчик, например ~/.avfs$PWD/foo.apk#uzip/META-INF.
Жиль
1
на самом деле я имел в виду извлечение файла JAR / двоичного файла из архива ZIP. У меня еще не было возможности протестировать его. Можете ли вы увидеть какие-либо проблемы с использованием первой команды выше для извлечения двоичных файлов?
Нафтули Кей
2
@TKKocheran: Нет проблем, -pизвлекает файл как есть ( -cвыполняет преобразование текста).
Жиль
2
Я думаю, что ответ @Myles более элегантный, потому что он не требует перенаправления вывода и сохраняет атрибуты файла.
gertvdijk
153
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Введите полный путь к архивному файлу, а не только имя файла. Обязательно сохраняйте структуру в виде zip-файла.

Это позволит извлечь один файл file.txtв myarchive.zipс /path/to/unzip/to/file.txt.

sMyles
источник
19
Это лучший ответ.
Redburn
1
Он не обрабатывает случай, когда вы хотите, чтобы сгенерированное имя файла было другим.
Олег Васкевич
6
параметр "-j": нежелательные пути. Структура каталогов архива не воссоздается; все файлы хранятся в каталоге извлечения (по умолчанию текущий). параметр "-d": извлечение файлов в exdir
e1i45
1
@OlegVaskevich, вопрос не требует, чтобы целевое имя файла было другим
Tapemaster
Да, знаю. Все еще проголосовали. :)
Олег Васкевич
25

Более простая версия:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Это будет воссоздано PATH_OF_FILE_INSIDE_ARCHIVEв текущем каталоге, но извлечет только указанный файл.

Чтобы просмотреть все файлы в Zip-архиве:

unzip -l ARCHIVE_NAME
Taukir
источник
2
Гораздо проще, чем принятый ответ.
FractalSpace
Действительно, все работало нормально, и это стало проще
Махмуд Али
2

В macOS , которая по умолчанию использует Info-Zip

Сначала перечислите файлы, чтобы найти то, что вы хотите

unzip -l my.zip

Затем предоставьте список файлов для извлечения из архива

unzip my.zip annoying/path/to/file

Объединить с -p для стандартного вывода

unzip -p my.zip annoying/path/to/file >./file
Кэмерон Лоуэлл Палмер
источник
1
Я не понимаю, почему люди понижают голос без какой-либо очевидной причины. Это правильный ответ (не только для macOS)
FractalSpace
@FractalSpace Это явно не так, это противоположно тому, что хочет ОП.
Конрад Рудольф
Ключом является получение отдельного файла. Вывод в stdout и перенаправление с использованием флага -p тривиальны, но я добавил их явно
Кэмерон Лоуэлл Палмер
2

простое использование:

unzip zipfile.zip path/inside/zip/file.txt

и он будет раздувать файл.

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php
Сезар Алехандро Браво Анайя
источник
Можно также добавить -d outpathаргумент, чтобы указать, куда помещается файл.
Эфрен
И -jаргумент, чтобы избежать сжатых путей
Эфрен