Витягнути лише певний файл із заархівованого архіву в заданий каталог


150

Мені потрібно витягти один файл із 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 Kocheran: Чому ти просто не перевіриш його? Я перевірив першу команду, і вона спрацювала.
користувач невідомий

1
@TKKocheran: Файли Jar - це блискавки, тому методи розпакування та запобігання запалювання, очевидно, спрацюють. Метод AVFS також працює, тому що AVFS відгадує формат на основі імен файлів і знає про них .jar; якщо ваш файл названий по-іншому, вам може знадобитися сказати AVFS використовувати його поштовий обробник, наприклад ~/.avfs$PWD/foo.apk#uzip/META-INF.
Жиль

1
власне, я мав на увазі витяг JAR / бінарного файлу з архіву ZIP. У мене ще не було можливості перевірити це, чи можна побачити проблеми, використовуючи першу команду вище для вилучення бінарних файлів?
Naftuli Kay

2
@TKKocheran: Немає проблем, -pвитягує файл таким, який є ( -cробить перетворення тексту).
Жиль

2
Я думаю, що відповідь @Myles є більш елегантною, тому що вона не потребує перенаправлення виводу, і вона зберігає атрибути файлів.
gertvdijk

152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Введіть повний шлях для блискавленого файлу, а не лише ім'я файлу. Не забудьте зберегти структуру, як видно з поштового файлу.

Це дозволить витягти один файл file.txtв myarchive.zipс /path/to/unzip/to/file.txt.


18
Це краща відповідь.
почервоніння

1
Він не обробляє випадок, коли ви хочете, щоб створене ім'я файлу було іншим.
Олег Васкевич

6
параметр "-j": небажані шляхи. Структура каталогів архіву не відтворена; всі файли зберігаються в каталозі вилучення (за замовчуванням поточний). параметр "-d": витягніть файли в exdir
e1i45

1
@OlegVaskevich, питання не вимагає, щоб
іменований

Так, я знаю. Досі голосували. :)
Олег Васкевич

24

Простіша версія:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Це буде відтворено PATH_OF_FILE_INSIDE_ARCHIVEв поточному каталозі, але витягує лише вказаний файл.

Щоб перерахувати всі файли в Zip-архіві:

unzip -l ARCHIVE_NAME

1
Набагато простіше, ніж прийнята відповідь.
FractalSpace

Дійсно, працювали чудово, і це waaaay простіше
Махмуд Алі

2

На macOS , який за замовчуванням використовує Info-Zip

Спочатку перелічіть файли, щоб знайти те, що ви хочете

unzip -l my.zip

Потім надайте список файлів, які потрібно витягнути з архіву

unzip my.zip annoying/path/to/file

Поєднайте з -p для stdout

unzip -p my.zip annoying/path/to/file >./file

1
Я не розумію, чому люди беруть участь без будь-яких очевидних причин. Це правильна відповідь (не лише для macOS)
FractalSpace

@FractalSpace Це очевидно не так, це робить навпаки, що хоче ОП.
Конрад Рудольф

Ключовим є отримання індивідуального файлу. Вихід до stdout та переспрямування за допомогою прапора -p є тривіальним, але я його явно додав
Cameron Lowell Palmer

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аргумент уникати стислих шляхів
Ефрен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.