zip все файлы в каталоге?

<p>есть ли способ сжать все файлы в данном каталоге с помощью команды <code>zip</code>? я слышал об использовании <code>*.*</code>, но я хочу, чтобы он работал и для файлов без расширений.</p>

<p>вы можете просто использовать <code>*</code>; нет необходимости в <code>*.*</code>. расширения файлов не являются специальными в unix. <code>*</code> соответствует нулю или более символов, включая точку. так что это соответствует <code>foo.png</code>, потому что это ноль или более символов (семь, если быть точным).</p><p>обратите внимание, что <code>*</code> по умолчанию не соответствует файлам, начинающимся с точки (также не соответствует <code>*.*</code>). это часто то, что вы хотите. если нет, в bash, если вы <code>shopt -s dotglob</code> это будет (но все равно исключит <code>.</code> а также <code>..</code>). в других оболочках есть разные способы (или их вообще нет) включения файлов точек.</p><p>кроме того, <code>zip</code> также имеет <code>-r</code> (рекурсивная) опция для создания целых деревьев каталогов одновременно (и не нужно беспокоиться о проблеме с точечным файлом):</p><pre><code>zip -r myfiles.zip mydir </code></pre><p>где <code>mydir</code> - это каталог, содержащий ваши файлы. обратите внимание, что созданный zip будет содержать структуру каталогов, а также файлы. как отмечает петерф в своем комментарии, это обычно рассматривается как хорошая вещь: распаковка zip аккуратно сохранит все извлеченные файлы в одном подкаталоге.</p><p>вы также можете указать zip не хранить пути с помощью <code>-j</code>/<code>--junk-paths</code> вариант.</p><p>команда <code>zip</code> поставляется с документацией, рассказывающей обо всех ее (многих) параметрах; тип <code>man zip</code> чтобы увидеть эту документацию. это не уникально для zip; таким образом вы можете получить документацию для большинства команд.</p>

<p>в моем случае я хотел сжать каждый файл в отдельный архив, поэтому я сделал следующее (в <code>zsh</code>):</p><pre><code>$ for file in ; do zip ${file%.*}.zip $file; done 

другим способом было бы использовать find и xargs: (это может включать в себя каталог "." в zip, но он все равно должен извлекаться правильно. в моем тесте zip удалил точку перед сжатием) find . -type f -exec zip zipfile.zip {} +(+ можно заменить на ; если ваша версия find не поддерживает + конец для исполнения. это будет медленнее, хотя ...)это будет по умолчанию включать все подкаталоги. вкл gnu найти -maxdepth может предотвратить это.

еще один (медленный) метод для этого (который добавляет один файл в zip одновременно):for f in  .[^.]; do [ -r "$f" ] || continue # skip directories or non-existant files (probably ".[^.]*" if directory has no dotfiles). using -e will allow directories to be used as well zip zipfile.zip "$f" # if directories are included, you probably want to add -r done </code></pre><p>это имеет проблемы с точечным файлом <code>*</code> (обходной путь добавлен) и будет запускать zip один раз для каждого файла, добавляя его в архив. в <code>bash</code> он будет работать с большим количеством файлов.</p><p>это будет медленнее, чем большинство других методов, но относительно просто.</p>