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

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

 $ unzip sample.zip 

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

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

  • В сценарии оболочки, Как передать переменную другое значение после выполнения одного задания?
  • Сжимать zip-файлы с более высоким сжатием
  • Возможно ли интегрировать файлы zip и tar.gz в качестве каталога в файловую систему
  • Только чтение файлов файловой системы в формате .zip
  • Менеджер архива не показывает файл с именем «-»
  • Как grep файл bz2, который находится далее в папке с zip-файлом
  • Текст с круговым отключением через zip, unzip с ошибкой «лишних байтов» в OS X
  • Как найти поврежденные архивные файлы?
  • 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} . Я настоятельно рекомендую сделать это в каталоге, который не содержит критических данных; Я очень сомневаюсь, что в этом скрипте есть искажающая данные ошибка, но: если она ломается, вы можете сохранить все части.

    Interesting Posts

    cpufreqd не контролирует температуру плюс показывает отсутствие выхода

    В терминале osx, как открыть EMACS в новом окне?

    Безопасная альтернатива FOSS для Skype на Linux и OpenBSD?

    Сценарий Bash – автоматический ввод пользовательского ввода (пароль хранилища ключей)

    В документах Emacsclient упоминается эмуляция Gnuclient. Каковы отношения?

    удалять содержимое каталога элегантным способом

    pem file difference – ssh-keygen vs openssl

    Невозможно найти lib в пути

    Временная метка оборудования с использованием PTP

    Невозможно выполнить программу без прав root независимо от группы или разрешений

    Как изменить идентификатор UID Squid во FreeBSD?

    linux для отображения деталей (например, PID, VID) подключенных устройств на последовательный порт (ы) (например, RS232) компьютера

    Правило ip6tables, чтобы разрешить непризнанный следующий заголовок

    Входит ли CentOS в семейство System V? Как он считается сравнимым с семейством Unix System V?

    OpenWRT: сброс настроек iptables по умолчанию

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