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.

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 -@

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

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

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 -@

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 '.*'

5

Die richtige Methode wäre:

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

@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"

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%)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.