#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.