it-swarm-ru.tech

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

Есть ли способ сжать все файлы в данном каталоге с помощью команды Zip? Я слышал об использовании *.*, но я хочу, чтобы он работал и для файлов без расширений.

523
tkbx

Вы можете просто использовать *; нет необходимости в *.*. Расширения файлов не являются специальными в Unix. * соответствует нулю или более символов, включая точку. Так что это соответствует foo.png, потому что это ноль или более символов (семь, если быть точным).

Обратите внимание, что * по умолчанию не соответствует файлам, начинающимся с точки (также не соответствует *.*). Это часто то, что вы хотите. Если нет, в bash, если вы shopt -s dotglob это будет (но все равно исключит . а также ..). В других оболочках есть разные способы (или их вообще нет) включения файлов точек.

Кроме того, Zip также имеет -r (рекурсивная) опция для создания целых деревьев каталогов одновременно (и не нужно беспокоиться о проблеме с точечным файлом):

Zip -r myfiles.Zip mydir

где mydir - это каталог, содержащий ваши файлы. Обратите внимание, что созданный Zip будет содержать структуру каталогов, а также файлы. Как отмечает Петерф в своем комментарии, это обычно рассматривается как хорошая вещь: распаковка Zip аккуратно сохранит все извлеченные файлы в одном подкаталоге.

Вы также можете указать Zip не хранить пути с помощью -j/--junk-paths вариант.

Команда Zip поставляется с документацией, рассказывающей обо всех ее (многих) параметрах; тип man Zip чтобы увидеть эту документацию. Это не уникально для Zip; таким образом вы можете получить документацию для большинства команд.

753
derobert

В моем случае я хотел сжать каждый файл в отдельный архив, поэтому я сделал следующее (в zsh):

$ for file in *; do Zip ${file%.*}.Zip $file; done
15
Radon Rosborough

Другим способом было бы использовать find и xargs: (это может включать в себя каталог "." В Zip, но он все равно должен извлекаться правильно. В моем тесте Zip удалил точку перед сжатием) find . -type f -exec Zip zipfile.Zip {} +

(+ можно заменить на \; если ваша версия find не поддерживает + конец для исполнения. Это будет медленнее, хотя ...)

Это будет по умолчанию включать все подкаталоги. Вкл GNU найти -maxdepth может предотвратить это.

8
Gert van den Berg

Еще один (медленный) метод для этого (который добавляет один файл в 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

Это имеет проблемы с точечным файлом * (обходной путь добавлен) и будет запускать Zip один раз для каждого файла, добавляя его в архив. В bash он будет работать с большим количеством файлов.

Это будет медленнее, чем большинство других методов, но относительно просто.

2
Gert van den Berg