Unix-Zip-Verzeichnis, jedoch ohne bestimmte Unterverzeichnisse (und alle darin enthaltenen)

115

Ich versuche, ein Verzeichnis zu komprimieren (unter Unix über SSH), muss jedoch einige Unterverzeichnisse (und alle darin enthaltenen Dateien und Verzeichnisse) ausschließen.

Bisher habe ich das:

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

Das scheint aber nicht zu funktionieren.

Ich habe es auch versucht

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

Dies schließt jedoch weiterhin Unterverzeichnisse in ignoreDir1 und ignoreDir2 ein.

Die Unterverzeichnisstruktur in den Verzeichnissen, die ich ausschließen möchte, ist ziemlich umfangreich, sodass ich nicht einfach jedes Verzeichnis zum Argument -x hinzufügen kann.

Weiß jemand, wie man das macht?

sulman
quelle
@AlexanderMills - Siehe diese Frage.
Jww

Antworten:

130

Ich war so nah!

Der eigentliche Befehl, den ich brauche, ist:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*
sulman
quelle
Cool, und danke für die Nachverfolgung! Sie können übrigens Ihre eigene Antwort akzeptieren.
Daniel H
2
Das hat bei mir mit osx nicht geklappt. @pathfilder antwortete allerdings.
Rynop
11
Stattdessen: -x dir1 / ignoreDir1 / ** \ *, können Sie dies tun: -x dir1 / ignoreDir1 / \ *
Richard Gomes
67

Für mein spezielles System musste ich, um ein Verzeichnis auszuschließen, meine ausgeschlossenen Verzeichnisse in Anführungszeichen setzen und es funktionierte wie ein Zauber:

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

Anmerkungen:

- Dies schloss sowohl das auszuschließende Verzeichnis als auch alle darin enthaltenen Dateien aus.

- Sie müssen den vollständigen Pfad zu den Verzeichnissen verwenden, die Sie ausschließen möchten!

Pfadfinder
quelle
5
Dies ist diejenige, die unter Mac OS funktioniert. :-)
körperliche
9
Da niemand den Grund für die Angabe von Pfaden oder das Entziehen des Sternchens erläutert hat, ist der Grund folgender: Wenn der Pfad nicht angegeben oder der Platzhalter entzogen wird, führt die Shell eine Platzhaltererweiterung durch, bevor sie an übergeben wird zip, und erhält eine Liste von Pfade zu Einträgen in den angegebenen Verzeichnissen, aber keine Pfade zu Dateien in deren Unterverzeichnissen, wodurch veranlasst wird zip, nicht alles in den angegebenen Verzeichnissen zu ignorieren.
Zagrimsan
Ich denke , ursprünglich einer der Gründe , dies gearbeitet wurde , weil auf Mac OS gab es Räume in meinen Verzeichnissen und dies vermied ein \ benötigen
Pathfinder
Vielen Dank, dass Sie @zagrimsan geklärt haben. Dass sowohl das Problem behoben und erklärt den Grund dafür , so dass wir sie verstehen (was auch praktisch in der Zukunft für andere Dinge kommen wird). 👍
Synetech
8

@sulman mit:

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

enthält weiterhin den Ordner dir1 / ignoreDir1 / empty im ZIP-Archiv.

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

Wenn Sie dies tun möchten, können Sie auch ein führendes ** verwenden, um in Unterordnern zu suchen, anstatt nur in dir1

Gianluca P.
quelle
Ach ok Vielen Dank, dass Sie Licht ins Dunkel gebracht haben!
Sulman
7

Folgendes wird genügen

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

Wofür hast du das **gebraucht, @sulman?

Es funktioniert wie ein Zauber für mich wie folgt:

[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
quelle
Ich weiß nicht, warum das ** benötigt wird. Vielleicht kann jemand anderes Licht ins Dunkel bringen?
Sulman
Sorry, @sulman, ich habe falsch geschrieben. Was ich gemeint habe, ist gemäß meiner letzten Bearbeitung. Funktioniert wie ein Zauber für mich :)
Ericn
1

Genau wie andere Antworten, aber Verzeichnisse vollständig ausschließen, anstatt den gesamten Inhalt von Verzeichnissen auszuschließen:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*
Richard Gomes
quelle
0

Ich fand, dass dies von David R Heffelfinger funktioniert :

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

Es schloss das Verzeichnis und seinen Inhalt aus.

Rick Ehrahrt
quelle
Sicherlich ist der Backslash zwischen dir1und ignorDir2ein Schrägstrich. Meinen Sie, dass die anderen Backslashes Backslashes sind? Wenn ja, dann haben Sie gerade die Antwort von FuzzyBee von vor zwei Jahren kopiert.
G-Man
-1

Bei mir hat gearbeitet: zip -9 -r ~ / folded.zip online -x ordner / ordner2 / ordner3 / foldern / \ * .

Scheint so zu sein, dass das Sternchen maskiert werden muss.

Francisco M
quelle
2
Wie unterscheidet sich das von der Lösung von Rick Ehrahrt vor einem Jahr oder von Eric's (vor ein paar Jahren)? Bitte lesen Sie die bereitgestellten Lösungen, bevor Sie eine neue veröffentlichen ...
zagrimsan
Weil ich vor dem Sternchen einen Backslash eingefügt habe (das soll dem Sternchen entgehen). In der Linux-Version funktioniert meine Arbeit nicht, wenn ich das nicht tue.
Francisco M
Auch Rick Ehrahrt (2014) und Eric (2012) haben die gleiche Lösung gepostet (um dem Sternchen zu entkommen). An der Lösung ist nichts auszusetzen, aber das mehrfache Posten derselben ist nur dann sinnvoll, wenn Sie der Lösung durch die Erklärung, warum die Lösung funktioniert, mehr Tiefe verleihen können. In einem einfachen Fall wie diesem gibt es nichts mehr zu erklären. Bitte nehmen Sie das nicht persönlich. Ich möchte hier nur dazu beitragen, SU sauber und übersichtlich zu halten, damit Benutzer mit geringstem Aufwand die beste Lösung finden können.
Zagrimsan