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ć?


@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/**\*

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ć!


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


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

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/\*

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ść.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.