Zip-каталог Unix, але виключає конкретні підкаталоги (і все, що знаходиться в них)


115

Я намагаюся скомпонувати каталог (в Unix через SSH), але мені потрібно виключити пару підкаталогів (і всі файли та каталоги в них).

Поки що я маю це:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

Це, здається, не працює.

Я також спробував

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

Однак вони все ще включатимуть підкаталоги в ignoreDir1 та ignoreDir2.

Структура підкаталогу в каталогах, яку я хочу виключити, є досить істотною, тому я не можу просто додати кожен каталог до -x аргументу.

Хтось знає, як це зробити?


@AlexanderMills - Дивіться це питання.
jww

Відповіді:


130

Я був такий близько!

Фактична команда, яка мені потрібна:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

Класно, і дякую за наступні дії! Ви можете прийняти власну відповідь, до речі.
Даніель Н

2
Це не спрацювало для мене на OSX. @pathfilder відповідь все ж таки.
rynop

11
Замість цього: -x dir1 / ignoreDir1 / ** \ *, ви можете зробити це: -x dir1 / ignoreDir1 / \ *
Річард Гомес

67

Для моєї конкретної системи, щоб виключити каталог, мені довелося ставити цитати навколо моїх виключених каталогів, і це працювало як шарм:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

Примітки:

- це виключало як каталог для виключення, так і всі файли всередині нього.

- Ви повинні використовувати повний шлях до каталогів, які ви хочете виключити!


5
Це той, який працює на Mac OS. :-)
physicalattraction

9
Оскільки ніхто не пояснив причину вимагати або цитування шляхів, або уникнення зірочки, причина така: Якщо шлях не котирується або підкреслився підстановочний знак, оболонка виконає розширення шаблону перед тим, як передавати їх zip, і отримає список шляхи до записів у зазначених каталогах, але не шляхи до файлів, що знаходяться у підкаталогах, тим самим призводять zipдо того, щоб не ігнорувати все в даних каталогах.
zagrimsan

Я думаю, що спочатку однією з причин цього було те, що на Mac OS були місця в моїх каталогах, і це уникало потреби \
pathfinder

Дякуємо, що очистили речі @zagrimsan. Це обидва вирішило проблему і пояснило причину її, щоб ми її зрозуміли (що також стане в нагоді в майбутньому для інших речей). 👍
Synetech

8

@sulman, використовуючи:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 / ** \ * dir1 / ignoreDir2 / ** \ *

все ще буде включати dir1 / ignoreDir1 / порожню папку в zip-архів, використовуючи:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 ** dir1 / ignoreDir2 **

ви зробите фокус, ви також можете використовувати провідний ** для пошуку в підпапках, а не лише в dir1


Ну, тоді добре! Дякуємо, що пролили світло на це!
sulman

7

Зробимо наступне

zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 \ * dir1 / ignoreDir2 \ *

Що тобі було потрібно **, @sulman?

Це працює як шарм для мене наступним чином:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)

Я не знаю, для чого потрібен **. Може, хтось ще може пролити щось на це?
сульман

Вибачте, @sulman, я ввів неправильно. Що я мав на увазі, це згідно моєї останньої редакції. Діє як принадність для мене :)
ericn

1

Як і інші відповіді, але виключаючи каталоги повністю, замість виключення всього вмісту каталогів:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*

0

Я виявив, що це працює у Девіда Р Хефельфінгера :

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

Він виключив каталог та його вміст.


Безумовно, зворотний кут нахилу між dir1і ignorDir2має на увазі нахил вперед. Ви маєте на увазі, що для інших косих косих рисів буде накип? Якщо ви це зробите, то ви щойно скопіювали відповідь нечіткої інформації з двох років тому.
G-Man

-1

Для мене працювали: zip -9 -r ~ / folded.zip online -x папка / folder2 / folder3 / foldern / \ * .

Здається, що зірочку потрібно уникати.


2
Чим це відрізняється від рішення Ріка Ехрарта рік тому, або Еріка (ще кілька років тому)? Будь ласка, прочитайте надані рішення, перш ніж публікувати нові ...
zagrimsan

Тому що я додав зворотну косу рису перед зірочкою (тобто уникнути зірочки). У версії Linux на моїй роботі не працює, якщо я цього не роблю.
Франсіско М

Також Рік Ехрарт (2014) та Ерік (2012) розмістили те саме рішення (щоб уникнути зірочки). У рішенні немає нічого поганого, але розміщувати одне й те саме кілька разів не має сенсу, якщо не можна значно додати глибину до рішення, пояснивши, чому рішення працює. У такому простому випадку, нічого більше пояснювати не можна. Будь ласка, не сприймайте це особисто, мій єдиний намір тут - допомогти у підтримці СУ чистотою та лаконічністю, щоб користувачі могли з найменшими зусиллями знайти найкраще рішення.
загримсан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.