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.