Unix zip каталог, но исключены определенные подкаталоги (и все внутри них)

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

Ответы:

131

Я был так близко!

Фактическая команда мне нужна:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*
Сульмане
источник
Круто, и спасибо за продолжение! Кстати, вы можете принять свой ответ.
Даниэль Х
2
Это не работает для меня на OSX. Ответ @pathfilder сделал, хотя.
rynop 12.12.14
11
Вместо этого: -x dir1 / ignoreDir1 / ** \ *, вы можете сделать это: -x dir1 / ignoreDir1 / \ *
Ричард Гомес
67

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

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

Примечания:

- это исключает как каталог для исключения, так и все файлы внутри него.

- Вы должны использовать полный путь к каталогам, которые хотите исключить!

следопыт
источник
5
Это тот, который работает на Mac OS. :-)
физическая
9
Поскольку никто не объяснил причину, по которой требуется либо заключать в кавычки пути, либо экранировать звездочку, причина заключается в следующем: если путь не указан в кавычках или подстановочный знак не задан, оболочка выполнит раскрытие подстановочного знака, прежде чем передать их zip, и получит список пути к записям в указанных каталогах, но не пути к файлам в этих подкаталогах, что приводит zipк тому, что не следует игнорировать все в указанных каталогах.
Загримсан
Я думаю , что первоначально одна из причин , почему это работает , потому что был на Mac OS там были пробелы в моих каталогах и это избежать необходимости в \
Pathfinder
Спасибо за разъяснения @zagrimsan. Это и устранило проблему, и объяснило ее причину, чтобы мы ее поняли (что также пригодится в будущем для других вещей). 👍
Synetech
8

@sulman используя:

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

по-прежнему будет включать папку dir1 / ignoreDir1 / empty в zip-архив, используя:

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

добьется цели, вы также можете использовать ведущий ** для поиска в подпапках вместо только dir1

Джанлука П.
источник
Ах хорошо! Спасибо, что пролил свет на это!
Сулман
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%)
ericn
источник
Я не знаю, почему ** нужен. Может быть, кто-то еще может пролить свет на это?
Сулман
Извините, @sulman, я набрал неправильно. То, что я имел в виду, согласно моему последнему редактированию. Работает как очарование для меня :)
ericn
1

Точно так же как другие ответы, но полностью исключая каталоги, вместо того, чтобы исключить все содержимое каталогов:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*
Ричард Гомес
источник
0

Я нашел это, чтобы работать от Дэвида R Heffelfinger :

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

Исключен каталог и его содержимое.

Рик Эрахрт
источник
Конечно, обратная косая черта между dir1и ignorDir2предназначена для прямой косой черты. Вы имеете в виду, что другие обратные косые черты должны быть обратными? Если вы это сделаете, то вы только что скопировали ответ пушистика от двухлетней давности.
G-Man
-1

У меня сработало: zip -9 -r ~ / folded.zip онлайн -x folder / folder2 / folder3 / foldern / \ * .

Похоже на то, что звездочку надо экранировать.

Франциско М
источник
2
Чем это отличается от решения Рика Эрахра год назад или Эрика (еще несколько лет назад)? Пожалуйста, прочитайте предоставленные решения, прежде чем публиковать новое ...
zagrimsan
Потому что я добавил обратную косую черту перед звездочкой (то есть, чтобы избежать звездочки). В версии Linux у меня не работает, если я этого не делаю.
Франциско М
Также Rick Ehrahrt (2014) и eric (2012) опубликовали одно и то же решение (чтобы избежать звездочки). В решении нет ничего плохого, но публиковать одно и то же несколько раз не имеет смысла, если только можно существенно увеличить глубину решения, объяснив, почему решение работает. В простом случае, подобном этому, объяснять больше нечего. Пожалуйста, не принимайте это на свой счет, мое единственное намерение здесь состоит в том, чтобы помочь содержать SU в чистоте и краткости, чтобы пользователи могли найти лучшее решение с наименьшими усилиями.
Загримсан