2

Использование терминальной команды "unzip" представляется чрезвычайно полезным при развертывании CMS на удаленном сервере, поскольку вы можете перенести zip и распаковать его удаленно. Однако я не могу найти способ распаковать все файлы непосредственно в корень каталога, в котором находится .zip-файл. По умолчанию он создает папку с тем же именем, что и ZIP-файл, и извлекает файлы в эту папку, после чего мне нужно выполнить команду mv, чтобы переместить содержимое папки в корень.

Можно ли как-то сделать это за один шаг, используя unzip?

3 ответа3

2

Попробуйте использовать параметр -d, чтобы указать корневой каталог для извлечения. Ты можешь использовать '.' или '~' в качестве вашего каталога и избегайте ситуации, когда все помещается в каталог по умолчанию с именем zip-файла. Вот документация:

[-d exdir] Необязательный каталог для извлечения файлов.
По умолчанию все файлы и подкаталоги воссоздаются в текущем каталоге; опция -d позволяет извлекать данные в произвольный каталог (всегда при условии, что у вас есть разрешение на запись в каталог). Эта опция не обязательно должна появляться в конце командной строки; он также принимается перед спецификацией zipfile (с обычными параметрами), сразу после спецификации zipfile или между файлом (файлами) и опцией -x. Опция и каталог могут быть объединены без пробелов между ними, но учтите, что это может привести к подавлению нормального поведения оболочки. В частности, -d ~'' (tilde) is expanded by Unix C shells into the name of the user's home directory, but -d ~ '' обрабатывается как буквальный подкаталог `` ~ '' текущего каталога.

0

Конкретный ответ на ваш вопрос - нет. Распаковка, которая поставляется с OS X, не может изменить каталоги в zip-архиве на лету. Однако следует отметить, что zip - это не «создание каталога». Это часть архива. Правильно созданный zip-архив не будет иметь этой проблемы, если вы контролируете процесс создания:

$ ls -l
total 0
-rw-r--r--  1 bsmith  staff  0 Sep 30 22:01 b
-rw-r--r--  1 bsmith  staff  0 Sep 30 22:01 c
$ zip -r a.zip .
  adding: b (stored 0%)
  adding: c (stored 0%)
$ cd ../b
$ unzip ../a/a.zip
Archive:  ../a/a.zip
 extracting: b                       
 extracting: c                       
$ ls -l
total 0
-rw-r--r--@ 1 bsmith  staff  0 Sep 30 22:01 b
-rw-r--r--@ 1 bsmith  staff  0 Sep 30 22:01 c
0

Вы можете использовать флаг -j для того же.

Пример:

$ mkdir Testing && cd Testing
~/Testing $ touch one two three four five
~/Testing $ cd ..
$ zip -r Testing Testing
$ ls -la | grep Testing


drwxr-xr-x   7 username  staff    238 Aug  2 20:03 Testing
-rw-r--r--   1 username  staff    924 Aug  2 20:03 Testing.zip

Сейчас,

$ rm -rf Testing
$ unzip -j Testing.zip
$ ls -la

-rw-r--r--   1 username  staff     0 Aug  2 20:03 five
-rw-r--r--   1 username  staff     0 Aug  2 20:03 four
-rw-r--r--   1 username  staff     0 Aug  2 20:03 one
-rw-r--r--   1 username  staff     0 Aug  2 20:03 three
-rw-r--r--   1 username  staff     0 Aug  2 20:03 two

Это поможет вам извлечь содержимое архива, а не содержимое папки.

$ man unzip

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

Для получения дополнительной информации обратитесь к справочным страницам для распаковки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .