Вопрос: Как создать zip-архив целой директории через терминал без скрытых файлов?


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

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

zip -r zipfile.zip directory

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

zip -r zipfile.zip directory -x .*

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


188
2017-08-27 18:01


Источник




Ответы:


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

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

98
2017-08-27 19:27



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


Прежде всего, если вы не установили 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 -@

66
2017-08-11 06:28



Благодарим вас за помощь, чтобы помочь пользователю Ubuntu. Имейте в виду, что повторное утверждение принятого ответа в новом ответе просто добавляет к беспорядку и имеет высокую вероятность быть помеченным для удаления. - hmayag


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

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%)

52
2017-08-27 19:17



Я не думаю, что ваше последнее утверждение верно. .* будет расширяться оболочкой. - hammar
Я думаю, что это, вероятно, будет правильным, но я удалил его (не уверен в этом) :) - Rinzwind
это не сработало. Добавлены .svn-каталоги - Martin Thoma
@moose Шаблон exclude соответствует полному пути, а не только базовому имени файла, поэтому вам нужно исключить */.* так же как .* (*/ соответствует любой непустой последовательности каталогов). - Gilles
Это бежит, ничего не меняя! Лучший ответ. - Whitecat


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

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

8
2017-11-01 03:19





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

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

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

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'

8
2018-05-21 16:51





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

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

5
2018-05-08 16:49



@downvoter: Что случилось, похоже, это работает для меня. - jobin
Такая же проблема, как при Оригинальный ответ Ринзвинда (теперь исправлено): вы не исключаете подкаталоги. И как заметил Ринзвинд, вам нужно процитировать подстановочные знаки, иначе оболочка расширит их. - Gilles


В то время как zipping dirs исключает некоторое расширение файла:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"

4
2017-12-08 17:49