Wie kann ich über ein Terminal ein Zip-Archiv eines ganzen Verzeichnisses ohne versteckte Dateien erstellen?

220

Ich habe ein Projekt mit vielen versteckten Ordnern / Dateien. Ich möchte ein Zip-Archiv davon erstellen, aber im Archiv sollten sich keine versteckten Ordner / Dateien befinden. Wenn Dateien in einem versteckten Ordner nicht versteckt sind, sollten sie auch nicht enthalten sein.

Ich weiß, dass ich ein Zip-Archiv eines Verzeichnisses wie dieses erstellen kann:

zip -r zipfile.zip directory

Ich weiß auch, dass ich Dateien mit der Option -x ausschließen kann, daher dachte ich, dass dies funktionieren könnte:

zip -r zipfile.zip directory -x .*

Es hat nicht funktioniert. Alle versteckten Verzeichnisse befanden sich noch in der Zip-Datei.

Martin Thoma
quelle

Antworten:

107

Dies schließt auch versteckte Dateien in nicht versteckten Verzeichnissen aus:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@
ordnen
quelle
2
Danke für deine Antwort. Der Befehl ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) ist länger als erwartet, funktioniert aber einwandfrei. Unterverzeichnisse sind ebenfalls enthalten, also +1 und eine akzeptierte Antwort :-)
Martin Thoma
104

Wenn Sie zip noch nicht installiert haben, installieren Sie es zuerst wie folgt:

sudo apt-get install zip

Dann zum einfachen Erstellen einer Zip-Datei:

zip -r compressed_filename.zip foldername

Wenn Sie versteckte Dateien ausschließen möchten:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

Ausschließen von Dateien aus einem Zip-Archiv (entnommen aus http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Die Grundlagen zum Ausschließen von Dateien beim Erstellen eines ZIP-Archivs werden um das -xFlag zentriert , mit dem Dateien aus dem Archiv ausgeschlossen werden, die einem bestimmten Namen oder Muster entsprechen. Im einfachsten Fall sieht es so aus:

zip archive.zip files -x "ExcludeMe"

Das heißt, Sie können eine einzelne Datei ausschließen, beispielsweise "Nothanks.jpg".

zip archive.zip images/ -x "Nothanks.jpg"

Lassen Sie uns einige spezifische Beispiele behandeln, bei denen dies nützlich ist.

Schließen Sie .DS_Store-Dateien aus Zip-Archiven aus

Auf diese Weise wird verhindert, dass die normalerweise unsichtbaren Mac-Metadatendateien .DS_Store in ein ZIP-Archiv aufgenommen werden, das standardmäßig im Paket enthalten ist:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

Wenn das Verzeichnis jedoch Unterverzeichnisse enthält, sollten Sie eine andere Variante dieses Befehls verwenden, um die ds_store-Dateien auch aus den Unterverzeichnissen auszuschließen:

zip -r archive.zip directory -x "*/\.DS_Store"

Hinweis: Nicht für alle Shells sind Anführungszeichen erforderlich, damit dieser Befehl ordnungsgemäß ausgeführt werden kann. In der Bash-Shell (der Standardeinstellung für OS X) müssen Sie jedoch die Anführungszeichen zum Ausschließen mit Platzhaltern und Mustern verwenden.

Ausschließen bestimmter Dateitypen aus einem Zip-Archiv

Mit Platzhaltern können Sie auch alle Dateien eines bestimmten Typs ausschließen, indem Sie sich auf die Erweiterung konzentrieren. Mit diesem Befehl wird beispielsweise ein ganzes Verzeichnis ohne .jpgDateien komprimiert:

zip -r archive.zip directory -x "*.jpg"

Dies kann für eine bestimmte Dateierweiterung oder ein bestimmtes Muster geändert werden, das einem Dateinamen entspricht.

Schließen Sie das .git- oder .svn-Verzeichnis aus einem Zip-Archiv aus

Zip ein Verzeichnis, minus .gitund seinen Inhalt:

zip -r zipdir.zip directorytozip -x "*.git*"

Komprimieren Sie einen Ordner, ohne das .svnVerzeichnis einzuschließen:

zip -r zipped.zip directory -x "*.svn*"

Alle versteckten Dateien aus einem Zip-Archiv ausschließen

Da Muster und Platzhalter verwendet werden können, können Sie auch eine oder alle unsichtbaren Dateien und Ordner ausschließen , die so gemacht werden , indem sie mit einer Periode voran wird, ob es ein Verzeichnis ist wie .svnoder eine einzelne Datei wie .bash_profileoder .htaccess.

zip -r archivename.zip directorytozip -x "*.*"

Oder um alle unsichtbaren Dateien aus allen Unterverzeichnissen auszuschließen:

zip -r archive.zip directory -x "*/\.*"
MAK Ripon
quelle
5
Vielen Dank für Ihre Bemühungen, einem anderen Ubuntu-Benutzer zu helfen. Bedenken Sie bitte, dass das Wiederherstellen der akzeptierten Antwort in einer neuen Antwort die Unordnung nur vergrößert und mit hoher Wahrscheinlichkeit zum Entfernen markiert wird.
hmayag
54

In "auf die .*(sonst Shell erweitert .*den Punkt Dateien im aktuellen Verzeichnis), und auch versteckte Dateien in Unterordner ausschließen:

zip -r zipfile.zip . -x ".*" -x "*/.*"

Dies führt dazu, dass Dateien, die mit einem beginnen, .nicht zu Ihrer ZIP-Datei hinzugefügt werden.

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)
Rinzwind
quelle
1
Ich denke nicht, dass deine letzte Aussage richtig ist. .*würde durch die Schale erweitert werden.
Hammar
1
Ich denke, es ist wahrscheinlich richtig, aber ich habe es entfernt (nicht sicher) :)
Rinzwind
das hat nicht funktioniert. Die .svn-Verzeichnisse wurden hinzugefügt
Martin Thoma
1
@moose Das Muster entspricht den vollständigen Pfad ausschließen, nicht nur die Datei Basisnamen, so müssen Sie ausschließen */.*sowie .*( */jede nicht-leere Folge von Verzeichnissen übereinstimmt).
Gilles
Das läuft ohne irgendetwas zu ändern! Beste Antwort.
Whitecat
8

Dieser beinhaltet alle "." Verzeichnisse, Unterverzeichnisse und "." Dateien oder Verzeichnisse in Verzeichnissen ... Im Wesentlichen die erste Antwort, enthält aber die oberste Ebene "." Dateien.

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@
Cosimnot
quelle
8

Beispiel für das Ausschließen aller Ordner, die mit beginnen. :

tar cvpzf folder.tgz folder/ --exclude '.*'

Besser komprimieren, aber langsamer:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'
Tigrouzen
quelle
5

Die richtige Methode wäre:

zip -r zipfile.zip directory -x directory/.*
Rômulo Neves
quelle
@downvoter: Was ist los, das scheint bei mir zu funktionieren.
Jobin
Dasselbe Problem wie bei Rinzwinds ursprünglicher Antwort (jetzt korrigiert): Sie schließen Unterverzeichnisse nicht aus. Und wie Rinzwind angemerkt hat, müssen Sie die Platzhalter in Anführungszeichen setzen, andernfalls werden sie von der Shell erweitert.
Gilles
4

Beim Zippen von Verzeichnissen mit Ausnahme einiger Dateierweiterungen:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"
K-Gun
quelle
3

Ohne versteckte Ordner und Dateien im Verzeichnis:

zip -r zipfile.zip directory/*

Verzeichnis: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
Umanshield
quelle