Directory zip Unix ma escluse specifiche sottodirectory (e tutto ciò che contiene)


115

Sto cercando di comprimere una directory (su Unix tramite SSH) ma ho bisogno di escludere un paio di sottodirectory (e tutti i file e le directory al loro interno).

Finora ho questo:

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

Non sembra funzionare però.

Ho anche provato

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

Tuttavia, ciò includerà comunque le sottodirectory all'interno di ignoreDir1 e ignoreDir2.

La struttura della sottodirectory nelle directory che voglio escludere è abbastanza sostanziale, quindi non posso semplicemente aggiungere ogni directory all'argomento -x.

Qualcuno sa come fare questo?


@AlexanderMills - Vedi questa domanda.
JWW

Risposte:


131

Ero così vicino!

Il comando effettivo di cui ho bisogno è:

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

Fantastico, e grazie per il seguito! A proposito, puoi accettare la tua risposta.
Daniel H,

2
Questo non ha funzionato per me su osx. La risposta di @pathfilder ha fatto però.
rynop,

11
Invece di questo: -x dir1 / ignoreDir1 / ** \ *, puoi farlo: -x dir1 / ignoreDir1 / \ *
Richard Gomes,

67

Per il mio sistema particolare, al fine di escludere una directory ho dovuto mettere le virgolette intorno alle mie directory escluse e ha funzionato come un incantesimo:

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

Appunti:

- questo ha escluso sia la directory da escludere sia tutti i file al suo interno.

- È necessario utilizzare il percorso completo per le directory che si desidera escludere!


5
Questo è quello che funziona su Mac OS. :-)
fisica

9
Poiché nessuno ha spiegato il motivo per cui è necessario quotare i percorsi o sfuggire all'asterisco, il motivo è questo: se il percorso non è quotato o il carattere jolly è scappato, la shell eseguirà l'espansione dei caratteri jolly prima di passarli a zip, che riceverà un elenco di percorsi alle voci nelle directory specificate, ma non percorsi ai file all'interno delle sottodirectory di quelle, causando così zipdi non ignorare tutto nelle directory indicate.
Zagrimsan,

Credo che in origine una delle ragioni per cui questo ha funzionato è stato perché in Mac OS c'erano spazi nei miei directory e questo evitato che necessitano di un \
pathfinder

Grazie per aver chiarito le cose @zagrimsan. Ciò ha risolto il problema e spiegato il motivo per cui lo comprendiamo (che sarà utile anche in futuro per altre cose). 👍
Synetech,

8

@sulman utilizzando:

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

includerà comunque la cartella dir1 / ignoreDir1 / empty nell'archivio zip, usando:

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

farà il trucco, puoi anche usare un ** iniziale per cercare nelle sottocartelle anziché solo dir1


Ah ok! Grazie per far luce su questo!
Sulman,

7

Farà quanto segue

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

A cosa ti serviva **, @sulman?

Per me funziona come un incantesimo come segue:

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

Non so perché sia ​​necessario **. Forse qualcun altro può far luce su questo?
Sulman,

Mi dispiace, @sulman, ho scritto male. Quello che intendevo è come per la mia ultima modifica. Funziona come un incanto per me :)
ericn,

1

Proprio come altre risposte, ma escludendo completamente le directory, anziché escludere tutti i contenuti delle directory:

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

0

Ho scoperto che funziona da David R Heffelfinger :

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

Ha escluso la directory e i suoi contenuti.


Sicuramente la barra rovesciata tra dir1ed ignorDir2è pensata per essere una barra. Vuoi dire che le altre barre rovesciate sono barre rovesciate? Se lo fai, hai appena copiato la risposta di fuzzybee di due anni fa.
G-Man,

-1

Per me ha funzionato: zip -9 -r ~ / folded.zip online -x cartella / cartella2 / cartella3 / foldern / \ * .

Sembra che l'asterisco debba essere evaso.


2
In che modo differisce dalla soluzione di Rick Ehrahrt un anno fa o di Eric (qualche anno fa)? Si prega di leggere le soluzioni fornite prima di pubblicarne una nuova ...
zagrimsan,

Perché ho aggiunto una barra rovesciata prima dell'asterisco (ovvero per sfuggire all'asterisco). Nella versione Linux al mio lavoro non funziona se non lo faccio.
Francisco M,

Anche Rick Ehrahrt (2014) ed eric (2012) hanno pubblicato la stessa soluzione (per sfuggire all'asterisco). Non c'è niente di sbagliato nella soluzione, ma pubblicare lo stesso più volte non ha senso a meno che non si possa aggiungere significativamente profondità alla soluzione spiegando perché la soluzione funziona. In un caso semplice come questo, non c'è niente da spiegare di più. Per favore, non prenderlo sul personale, la mia unica intenzione qui è di aiutare a mantenere SU pulito e conciso in modo che gli utenti possano trovare la soluzione migliore con il minimo sforzo.
Zagrimsan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.