Як я можу створити 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 та прийнята відповідь :-)
Мартін Тома

104

Перш за все, якщо у вас немає встановленого 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 Archives

Це запобіжить .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. Будь ласка, майте на увазі, що повторне зазначення прийнятої відповіді в новій відповіді просто додає клопоту і має велику ймовірність бути позначеним для видалення.
hmayag

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

1
Я не думаю, що ваше останнє твердження є правильним. .*розшириться оболонкою.
хаммар

1
Я думаю, що це, мабуть, правильно, але я видалив його (не впевнений у цьому) :)
Rinzwind

це не спрацювало. Додано .svn-каталоги
Мартін Тома

1
@moose Шаблон виключення відповідає повному шляху, а не лише базовій назві файлу, тому його потрібно виключити */.*також, як і .*( */відповідає будь-якій не порожній послідовності каталогів).
Жиль

Це працює, не змінюючи нічого! Найкраща відповідь.
Whitecat

8

Цей включає всі "". каталоги, підкаталоги та "." файли або каталоги в каталогах ... По суті це перша відповідь, але включає верхній рівень ". файли.

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

8

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

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

Краще стискати, але повільніше:

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

5

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

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

@downvoter: Що не так, це, здається, працює для мене.
Jobin

Та ж проблема, що і з оригінальною відповіддю Rinzwind (тепер виправлена): ви не виключаєте підкаталоги. І як зауважив Рінцвінд, потрібно цитувати підстановку, інакше оболонка їх розширить.
Жиль

4

Під час завантаження файлів, за винятком деякого розширення файлу:

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

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%)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.