Командная строка заархивируйте все в каталоге, но не включайте ни один каталог в качестве корневого

#macos #unix #zip #command-line-interface

#macos #unix #zip #интерфейс командной строки

Вопрос:

Я ни за что на свете не смогу найти ответ на этот вопрос. Поскольку я упаковываю ZIP-файл определенным образом для процесса сборки, я вообще не хочу включать папку в результирующий zip-файл в корне. Например, если у меня есть этот путь к файлу:

 MyFolder/
    A.png
    B.txt
    C.mp3
  

И я использую либо команду:

 zip -r -X "MyFolder.zip" MyFolder/*
  

или

 cd MyFolder; zip -r -X "../MyFolder.zip" *
  

В итоге я получаю zip-файл, который содержит корневой элемент MyFolder. Чего я хочу, так это чтобы при распаковке архива все это было сброшено прямо в каталог, вот так:

 A.png
B.txt
C.mp3
  

Другими словами, я не хочу, чтобы MyFolder или любая другая папка была корневой. Я прочитал все руководство и перепробовал множество опций и много поисковых запросов в Google, и zip, похоже, просто действительно хочет иметь папку в корне.

Спасибо!

Комментарии:

1. Удивлен, что второй тест не делает то, что вы хотите. Я только что протестировал это здесь, и, как я и ожидал, он не включает «MyFolder» в пути.

2. Да, если я разархивирую, он разархивирует папку под названием «MyFolder», содержащую все, что угодно, он не сбрасывает все в этот каталог, как хотелось бы. Это в Mac OS X.

3. Когда вы заархивируете или когда вы запускаете zipinfo в результирующем файле .zip, выдает ли он вам пути, включающие MyFolder ? Я попробовал это на своем Mac (OS X 10.9.3), и это сработало, как ожидалось.

4. Вы уверены, что не перепутали результирующие zip-файлы? Также помните, что запуск zip для существующего архива добавляет больше файлов, а не создает новый архив.

5. zipinfo выглядит правильно! Милые обезьяньи яйца, проблема была в Mac OS X (открытие zip из Finder с помощью утилиты архивирования. Использование unzip в командной строке работает должным образом. Спасибо за проверку работоспособности!

Ответ №1:

Это была ошибка утилиты архивирования (приложение для разархивирования Mac OS X). Когда я использовал команду unzip из командной строки, она отлично работает.

 (cd MyFolder amp;amp; zip -r -X "../MyFolder.zip" .)
  

Комментарии:

1. Я изменил ваше решение, так что вам не нужно фактически покидать текущий каталог, обернув ваш код в () и переключив ; на amp;amp; , например (cd MyFolder amp;amp; zip -r -X ../MyFolder.zip .)

2. Спасибо! Выглядит великолепно. Я отредактирую свой пост. Я полагаю, вы могли бы также:

Ответ №2:

Наткнулся на этот ответ, но не хотел менять в из каталогов. Я нашел -j полезной опцию, которая добавляет все файлы в корень zip. Обратите внимание, что это все файлы, поэтому структура подкаталогов сохранена не будет.

Итак, с этой структурой папок:

 MyFolder
 - MyFile1
 - MySubFolder
   - MyFile2
  

И эта команда:

 zip -rj MyFolder.zip MyFolder
  

Вы получаете это:

 MyFolder.zip
 - MyFile1
 - MyFile2
  

Ответ №3:

Я нашел более простой способ создать зашифрованный zip-файл с помощью приложения terminal на mac (mac os) просто из файлов вашей папки.

Команда для терминала

 zip -j -e wishedname.zip yourfolder/*
  

Вот и все. Наслаждайтесь!

*

Для получения дополнительной информации используйте zip command в приложении терминала

 man zip
  

Что делают -j и -e?

 -j
--junk-paths
Store  just  the  name  of a saved file (junk the path), and do not store directory names. By default, zip will store the full path (relative to the current directory).

-e
--encrypt
Encrypt  the contents of the zip archive using a password which is entered on the terminal in response to a prompt (this will not be echoed; if standard error is not a tty, zip will  exit with an error).  The password prompt is repeated to save the user from typing errors.
  

Ответ №4:

Установите zip

 sudo apt install zip
  

используйте zip

 zip -r foo.zip .
  

Вы можете использовать флаги от -0 (нет) до -9 (лучше всего), чтобы изменить скорость сжатия

Исключение файлов может быть выполнено с помощью флага -x. Со страницы руководства:

 -x files
--exclude files
          Explicitly exclude the specified files, as in:

                 zip -r foo foo -x *.o

          which  will  include the contents of foo in foo.zip while excluding all the files that end in .o.  The backslash avoids the shell filename substitution, so that the name matching
          is performed by zip at all directory levels.

          Also possible:

                 zip -r foo foo -x@exclude.lst

          which will include the contents of foo in foo.zip while excluding all the files that match the patterns in the file exclude.lst.

          The long option forms of the above are

                 zip -r foo foo --exclude *.o

          and

                 zip -r foo foo --exclude @exclude.lst

          Multiple patterns can be specified, as in:

                 zip -r foo foo -x *.o *.c

          If there is no space between -x and the pattern, just one value is assumed (no list):

                 zip -r foo foo -x*.o

          See -i for more on include and exclude.