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

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

 $ unzip sample.zip 

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

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

  • Закрепить файл как подкоманду
  • распаковать вложенные .zip-файлы по сценарию оболочки
  • Как я могу заставить unzip / zip не создавать подкаталог, когда я его извлекаю?
  • Как добавить огромный архив в архив и удалить его параллельно
  • Автоматическое извлечение zip-файлов, таких как osx
  • Как де-разархивировать, де-tar -xvf - de-unarchive в беспорядочной папке?
  • Разархивируйте содержимое файла, но без создания папки архива
  • Сжатие старых файлов журнала и переход в новый каталог
  • 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} . Я настоятельно рекомендую сделать это в каталоге, который не содержит критических данных; Я очень сомневаюсь, что в этом скрипте есть искажающая данные ошибка, но: если она ломается, вы можете сохранить все части.

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