Uniksowy katalog zip, ale wykluczył określone podkatalogi (i wszystko w nich zawarte)

115

Próbuję spakować katalog (na Unixie przez SSH), ale muszę wykluczyć kilka podkatalogów (oraz wszystkie zawarte w nich pliki i katalogi).

Do tej pory mam to:

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

To jednak nie działa.

Też próbowałem

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

Będzie to jednak nadal obejmować podkatalogi w ignoreDir1 i ignoreDir2.

Struktura podkatalogów w katalogach, które chcę wykluczyć, jest dość pokaźna, więc nie mogę po prostu dodać każdego katalogu do argumentu -x.

Czy ktoś wie jak to zrobić?

Sulman
źródło
@AlexanderMills - Zobacz to pytanie.
jww

Odpowiedzi:

130

Byłem tak blisko!

Rzeczywiste polecenie, którego potrzebuję to:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*
Sulman
źródło
Fajnie i dziękuję za informację! Nawiasem mówiąc, możesz zaakceptować własną odpowiedź.
Daniel H
2
To nie działało dla mnie na osx. Odpowiedź @ pathfilder zrobiła.
rynop
11
Zamiast tego: -x katalog1 / ignoreDir1 / ** \ *, możesz to zrobić: -x katalog1 / ignoreDir1 / \ *
Richard Gomes
67

W przypadku mojego konkretnego systemu, aby wykluczyć katalog, musiałem umieszczać cudzysłowy wokół wykluczonych katalogów i działało to jak urok:

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

Uwagi:

- wykluczało to zarówno katalog do wykluczenia, jak i wszystkie zawarte w nim pliki.

- Musisz użyć pełnej ścieżki do katalogów, które chcesz wykluczyć!

pionier
źródło
5
Ten działa w systemie Mac OS. :-)
fizyczne
9
Ponieważ nikt nie wyjaśnił, dlaczego wymagane jest albo cytowanie ścieżek, albo ucieczka od gwiazdki, powód jest następujący: jeśli ścieżka nie jest cytowana lub znak wieloznaczny ucieka, powłoka wykona rozwinięcie znaku zastępczego przed przekazaniem ich do zip, co otrzyma listę ścieżki do wpisów w określonych katalogach, ale nie ścieżki do plików w podkatalogach tych katalogów, co powoduje, zipże nie ignoruje się wszystkiego w podanych katalogach.
zagrimsan
Myślę, że pierwotnie jednym z powodów, dla których zadziałało, było to, że w systemie Mac OS były spacje w moich katalogach i uniknęliśmy potrzeby korzystania z \
pathfinder
Dziękujemy za wyjaśnienie @zagrimsan. To rozwiązało problem i wyjaśniło jego przyczynę, abyśmy go zrozumieli (co przyda się również w przyszłości do innych celów). 👍
Synetech
8

@sulman za pomocą:

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

nadal będzie zawierać katalog dir1 / ignoreDir1 / empty w archiwum zip, używając:

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

załatwi sprawę, możesz także użyć wiodącego ** do przeszukiwania podfolderów zamiast tylko katalogu 1

Gianluca P.
źródło
Ach okej! Dzięki za rzucić światło na to!
sulman
7

Zrobią to

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

Po co ci **@sulman?

Dla mnie działa to jak urok:

[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
źródło
Nie wiem, dlaczego ** jest potrzebne. Może ktoś inny może rzucić na to trochę światła?
sulman
Przepraszam, @sulman, źle wpisałem. Chodziło mi o to, jak w mojej najnowszej edycji. Działa jak dla mnie urok :)
ericn
1

Podobnie jak inne odpowiedzi, ale całkowicie wykluczając katalogi, zamiast wykluczać całą zawartość katalogów:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*
Richard Gomes
źródło
0

Znalazłem to do pracy od Davida R. Heffelfingera :

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

Wykluczono katalog i jego zawartość.

Rick Ehrahrt
źródło
Z pewnością odwrotny ukośnik między dir1i ignorDir2ma być ukośnikiem. Czy masz na myśli, że inne odwrotne ukośniki są odwrotnymi? Jeśli tak, to właśnie skopiowałeś odpowiedź Fuzzybee sprzed dwóch lat.
G-Man,
-1

Dla mnie pracował: zip -9 -r ~ / folded.zip online -x folder / folder2 / folder3 / foldern / \ * .

Wygląda na to, że gwiazdkę należy uciec.

Francisco M.
źródło
2
Czym różni się to od rozwiązania Ricka Ehrahrta sprzed roku lub Erica (kilka lat temu)? Proszę przeczytać dostarczone rozwiązania przed opublikowaniem nowego ...
zagrimsan
Ponieważ dodałem ukośnik odwrotny przed gwiazdką (czyli aby uciec przed gwiazdką). W wersji linux w mojej pracy nie działa, jeśli tego nie zrobię.
Francisco M,
Również Rick Ehrahrt (2014) i eric (2012) opublikowali to samo rozwiązanie (aby uciec od gwiazdki). Nie ma nic złego w rozwiązaniu, ale wielokrotne publikowanie tego samego nie ma sensu, chyba że można znacznie zwiększyć głębokość rozwiązania, wyjaśniając, dlaczego rozwiązanie działa. W takim prostym przypadku nie ma nic więcej do wyjaśnienia. Nie bierz tego do siebie, moim jedynym celem jest pomoc w utrzymaniu SU w czystości i zwięzłości, aby użytkownicy mogli znaleźć najlepsze rozwiązanie przy najmniejszym wysiłku.
zagrimsan