Как я могу создать zip-архив всего каталога через терминал без скрытых файлов?

220

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

Я знаю, что могу создать zip-архив каталога, например:

zip -r zipfile.zip directory

Я также знаю, что могу исключать файлы с параметром -x, поэтому я подумал, что это может сработать:

zip -r zipfile.zip directory -x .*

Это не сработало. Все скрытые каталоги все еще были в zip-файле.

Мартин Тома
источник

Ответы:

107

Это также исключает скрытые файлы в скрытых каталогах:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@
организовать
источник
2
Спасибо за Ваш ответ. Команда ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) длиннее, чем ожидалось, но работает нормально. Подкаталоги также включены, поэтому +1 и принятый ответ :-)
Мартин Тома
105

Прежде всего, если у вас не установлен zip, сначала установите его следующим образом:

sudo apt-get install zip

Тогда для простого создания zip-файла:

zip -r compressed_filename.zip foldername

Если вы хотите исключить скрытые файлы:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

Исключение файлов из архива Zip (взято с http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

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

zip archive.zip files -x "ExcludeMe"

Это означает, что вы можете исключить один файл, скажем, он называется «Nothanks.jpg»

zip archive.zip images/ -x "Nothanks.jpg"

Давайте рассмотрим несколько конкретных примеров, где это полезно.

Исключить файлы .DS_Store из Zip-архивов

Это предотвратит включение обычно невидимых .DS_Store файлов метаданных Mac в zip-архив, который по умолчанию входит в пакет:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

Однако, если каталог содержит подкаталоги, вы можете использовать другой вариант этой команды, чтобы исключить также файлы ds_store из подкаталогов:

zip -r archive.zip directory -x "*/\.DS_Store"

Примечание: не все оболочки требуют, чтобы кавычки для этой команды работали должным образом, но в оболочке bash (по умолчанию для OS X) вам нужно будет использовать кавычки для исключения с подстановочными знаками и шаблонами.

Исключить определенные типы файлов из Zip-архива

С подстановочными знаками вы также можете исключить все файлы определенного типа, сосредоточившись на расширении. Например, эта команда заархивирует весь каталог, за исключением любых .jpgфайлов:

zip -r archive.zip directory -x "*.jpg"

Это можно изменить для любого конкретного расширения файла или шаблона, соответствующего имени файла.

Исключить каталог .git или .svn из архива Zip

Zip каталог, минус .gitи его содержимое:

zip -r zipdir.zip directorytozip -x "*.git*"

Заархивируйте папку, не включая .svnкаталог:

zip -r zipped.zip directory -x "*.svn*"

Исключить все скрытые файлы из архива Zip

Поскольку можно использовать шаблоны и подстановочные знаки, вы также можете исключить любые или все невидимые файлы и папки, созданные таким образом, с префиксом точки, будь то каталог, подобный .svnили отдельный файл, подобный .bash_profileили .htaccess.

zip -r archivename.zip directorytozip -x "*.*"

Или исключить все невидимые файлы из всех подкаталогов:

zip -r archive.zip directory -x "*/\.*"
МАК Рипон
источник
5
Спасибо за ваши усилия, чтобы помочь другому пользователю Ubuntu. Помните, что повторение принятого ответа в новом ответе только добавляет беспорядок и имеет высокую вероятность быть помеченным для удаления.
Хмаяг
54

Добавьте "в .*(иначе ваша оболочка будет расширена .*до точечных файлов в текущем каталоге), а также исключите скрытые файлы в подкаталогах:

zip -r zipfile.zip . -x ".*" -x "*/.*"

Это приведет к тому, что файлы, начинающиеся с « .не», будут добавлены в ваш zip-файл.

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)
Rinzwind
источник
1
Я не думаю, что ваше последнее утверждение верно. .*будет расширен за счет оболочки.
Хаммар
1
Я думаю, что это, вероятно, будет правильным, но я удалил это (не уверен в этом) :)
Rinzwind
это не сработало. Добавлены .svn-каталоги
Мартин Тома
1
@moose исключающий шаблон соответствует полный путь, а не только имя файла базы, поэтому необходимо исключить */.*, а также .*( */соответствует любой непустой последовательности каталогов).
Жиль
Это работает, ничего не меняя! Лучший ответ.
Whitecat
8

Этот включает в себя все "." каталоги, подкаталоги и "." файлы или каталоги внутри каталогов ... По сути, первый ответ, но включает в себя верхний уровень "." файлы.

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@
cosimnot
источник
8

Пример для исключения всех папок, начинающихся с. :

tar cvpzf folder.tgz folder/ --exclude '.*'

Лучше сжимать, но медленнее:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'
Tigrouzen
источник
5

Правильный метод будет:

zip -r zipfile.zip directory -x directory/.*
Ромуло Невес
источник
@ downvoter: Что не так, похоже, это работает для меня.
Jobin
Та же проблема, что и в первоначальном ответе Ринзвинда (теперь исправлено): вы не исключаете подкаталоги. И, как заметил Ринзвинд, вам нужно заключать в кавычки символы, иначе оболочка их расширит.
Жиль
4

При архивировании директорий, исключая некоторые расширения файлов:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"
K-Gun
источник
3

Без скрытых папок и файлов в каталоге:

zip -r zipfile.zip directory/*

каталог: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
Umanshield
источник