распаковать каталог в unix

Я попытался unzip папку в Unix:

 $ unzip sample.zip 

Это создает корневую структуру a/b/c/d/e/f/sample .

Пожалуйста, порекомендуйте. Мне нужно unzip папку в текущем каталоге.

3 Solutions collect form web for “распаковать каталог в unix”

На странице unzip(1) :

  -j junk paths. The archive's directory structure is not recreated; all files are deposited in the extraction directory (by default, the current one). 

Распаковка папки без полной иерархии

Если вы просто пытаетесь разархивировать содержимое каталога в zip-файле, не сохраняя ни одной иерархии, в которой находится эта папка, в zip-файле вам не повезло. Этот метод не существует. Проблема в том, как создаются zip-файлы. Они, как правило, построены как сплошная капля, и поэтому они не легко доступны так, как думают многие.

Единственные 2 подхода, которые я видел, которые могут сделать это, – создать цикл, который проходит через индекс zip-файла, примерно так:

Способ №1

 for i in $(unzip -l zipfile.zip); do # look for specific location # when there, make directory structure you want # unzip zipfile.zip $i -d /some/tmp/dir # move file from /some/tmp/dir to new directory done 

Вышеприведенное может быть сделано на нескольких языках программирования, таких как Perl, Python и т. Д.

Способ №2

Другой метод включает в себя создание копии zip-файла, а затем с помощью инструмента zipnote для управления индексом файлов внутри архива, а затем извлечения файлов после того, как индекс zip-файла был обработан.

Распаковка папки с полной иерархией

Если, с другой стороны, вы просто пытаетесь извлечь одну папку из zip-файла, вы можете использовать эту команду для этого:

 $ unzip "/path/to/archive.zip" "in/archive/folder*" -d "/path/to/unzip/to" 

пример

Пример структуры каталога.

 $ tree . |-- 1 | |-- 2 | | |-- 3 | | | `-- 4 | | | `-- 5 | | | |-- file1 | | | |-- file2 | | | |-- file3 | | | |-- file4 | | | `-- file5 | | `-- afile | `-- afile `-- afile 

Застегнут.

 $ zip -r ../afile.zip . adding: afile (stored 0%) adding: 1/ (stored 0%) adding: 1/afile (stored 0%) adding: 1/2/ (stored 0%) adding: 1/2/afile (stored 0%) adding: 1/2/3/ (stored 0%) adding: 1/2/3/4/ (stored 0%) adding: 1/2/3/4/5/ (stored 0%) adding: 1/2/3/4/5/file1 (stored 0%) adding: 1/2/3/4/5/file2 (stored 0%) adding: 1/2/3/4/5/file3 (stored 0%) adding: 1/2/3/4/5/file5 (stored 0%) adding: 1/2/3/4/5/file4 (stored 0%) 

Подтверждение содержимого zip-файла.

 $ unzip -l ../afile.zip Archive: ../afile.zip Length Date Time Name --------- ---------- ----- ---- 0 11-07-2013 16:43 afile 0 11-07-2013 16:43 1/ 0 11-07-2013 16:43 1/afile 0 11-07-2013 16:43 1/2/ 0 11-07-2013 16:43 1/2/afile 0 11-07-2013 15:51 1/2/3/ 0 11-07-2013 15:51 1/2/3/4/ 0 11-07-2013 15:51 1/2/3/4/5/ 0 11-07-2013 15:51 1/2/3/4/5/file1 0 11-07-2013 15:51 1/2/3/4/5/file2 0 11-07-2013 15:51 1/2/3/4/5/file3 0 11-07-2013 15:51 1/2/3/4/5/file5 0 11-07-2013 15:51 1/2/3/4/5/file4 --------- ------- 0 13 files 

Теперь мы распаковываем только папку 5.

 $ unzip afile.zip "1/2/3/4/5*" -d new/ Archive: afile.zip creating: new/1/2/3/4/5/ extracting: new/1/2/3/4/5/file1 extracting: new/1/2/3/4/5/file2 extracting: new/1/2/3/4/5/file3 extracting: new/1/2/3/4/5/file5 extracting: new/1/2/3/4/5/file4 

Подтверждение распаковки:

 $ tree . . `-- 1 `-- 2 `-- 3 `-- 4 `-- 5 |-- file1 |-- file2 |-- file3 |-- file4 `-- file5 

Я не думаю, что вы можете сделать это напрямую, хотя это можно сделать немного круговым путем, распаковывая архив во временном месте и перемещая файлы в текущий каталог.

Проблема в том, что вы действительно не знаете о структуре содержимого zip-файла, поэтому этого довольно сложно решить в общем случае . Если вы хотите просто «развалить» первый компонент каталога и отбросить все под ним в текущую директорию, тогда мы можем написать сценарий оболочки или функцию оболочки, чтобы сделать это. Я приведу вам пример для GNU bash; это не должно быть трудно приспособиться к другим раковинам, если вы предпочитаете что-то другое. Вы можете поместить это в конец своего ~ / .bashrc, чтобы попробовать.

 unzip_to_current_dir() { zipfilenames="$@" for zipfilename in ${zipfilenames}; do tempdir=$(mktemp -d) unzip -d "${tempdir}" "${zipfilename}" mv "${tempdir}/*/*" ./ rm -rf "${tempdir}" done } 

Идея состоит в том, чтобы взять имена файлов zip, а затем, один за другим, создать временный каталог, разархивировать в этот каталог, переместить все в поддиректории первого уровня каталога unzip-target в текущий каталог, а затем очистить временный каталог перед тем как перейти к следующему файлу. Это эффективно удаляет первый компонент пути в zip-файле, поэтому распаковка zip-файла с / abc, a / bcd, a / cde и a / def / ghi сохраняет эти файлы как ./abc, ./bcd , ./cde и ./def/ghi.

Чтобы легко проверить, делает ли это то, что вам нужно, возьмите четыре строки с наибольшей отступкой и выполните их вручную, по одному за раз, заменив свое собственное значение на ${zipfilename} . Я настоятельно рекомендую сделать это в каталоге, который не содержит критических данных; Я очень сомневаюсь, что в этом скрипте есть искажающая данные ошибка, но: если она ломается, вы можете сохранить все части.

  • Распаковка с помощью tar: - слишком жадничать: как исключить только файл на уровне корневого уровня?
  • Команда для рекурсивного хеширования CRC (CRC32)
  • Преобразование Windows-созданного ZIP в Linux (проблемы с внутренними путями)
  • Возможно ли в unix выполнять поиск внутри zip-файлов
  • синхронизировать два zip-архива (с минимальным вводом-выводом)?
  • Помогите с распаковкой .dd.gz, возможно, поврежденной
  • Как я могу правильно распаковать ZIP-архив файлов с ивритскими именами?
  • Как получить параметр extract / compress при щелчке правой кнопкой мыши?
  • Как распаковать каталог внутри zip-файла
  • Подмена текста внутри сжатых файлов
  • Могу ли я закрепить всю папку с помощью gzip?
  • Сжимать несколько файлов и сохранять их имя?
  • Interesting Posts

    BASH – Ассоциативный массив – получение значения ключа в конечном элементе

    вывод команды команды в переменную

    Запустить программу Windows на Linux безопасным способом

    Использование столбца nos в качестве значения переменной

    Есть ли способ отправить пакеты через одного интернет-провайдера и получить ответы через другой?

    «файловая система / boot» имеет неправильный тип для системного раздела EFI '

    Как отображать сообщения printk, отфильтрованные по уровню по мере их поступления?

    Перемещение открытого файла на другое устройство

    Как управлять thinkpad_acpi через procfs, RHEL 6.4

    У Grub2 есть способ однозначно маркировать записи меню, которые можно использовать для установки по умолчанию для загрузки?

    Как именно люди «взломают» системы Unix / Linux?

    перебирать два списка переменных и назначать соответствующий порядок командам

    Установка Texlive на ПК-BSD 8.2

    Некоторые ошибки возникли, когда я установил lucene, модуль perl!

    Условие скрипта Bash всегда передается, даже когда grep не должен возвращать ничего

    Linux и Unix - лучшая ОС в мире.