Schließt beim Erstellen einer ZIP-Datei bestimmte Dateien aus allen Unterverzeichnissen aus

Schließt beim Erstellen einer ZIP-Datei bestimmte Dateien aus allen Unterverzeichnissen aus

Ich möchte alle .zip-Dateien in allen Unterverzeichnissen des übergeordneten Ordners, den ich komprimiere, ausschließen, aber das funktioniert nicht. Ich habe die man zipSeiten überprüft,DasUndDasFragen ohne Erfolg.

Ich habe versucht:

zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x\*.zip
zip -q -r FILE.zip * -x */\.zip
zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x \*.zip\*
zip -q -r FILE.zip * -x*.zip

und ich bekomme immer noch alle ZIP-Dateien eingeschlossen (außer der im übergeordneten Ordner, der zuvor mit diesem Befehl generiert wurde).

EDIT: Das Problem war, dass ich bereits eine FILE.zip im Ordner hatte, die einige Zip-Dateien enthielt. Der zipBefehlAktualisierunganstattschaffteine neue komprimierte Datei, wenn die Datei, die es erstellen soll, bereits vorhanden ist, auch wenn Sie die Option -u nicht angeben.

Antwort1

Sie müssen das Ausschlussmuster zitieren, wie Sie es bereits versucht haben. Das erste sollte eigentlich funktionieren, auch wenn es eine „bessere“ Lösung gibt.

Aber schauen wir uns ein vereinfachtes Beispiel zum Arbeiten an. Ich habe einige Verzeichnisse mit Dateien .foound .barErweiterungen erstellt:

Hier führe ich findeine Liste meines Testverzeichnisses aus. Es werden alle Dateien und Verzeichnisse angezeigt:

$ find
.
./1.bar
./1.foo
./sub1
./sub1/sub2
./sub1/sub2/1.bar
./sub1/sub2/1.foo
./sub1/1.foo
./sub1/1.bar

Jetzt können wir einfach sehen, was funktioniert
(wir räumen die Ausgabedatei aus dem Weg, sie ist für die Übereinstimmung nicht relevant).

Alle Dateien packen:

$ zip -r /tmp/out.zip *          
  adding: 1.bar (stored 0%)
  adding: 1.foo (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/sub2/1.foo (stored 0%)
  adding: sub1/1.foo (stored 0%)
  adding: sub1/1.bar (stored 0%)

Verpackung ohne .fooDateien:

$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x '*.foo'
  adding: 1.bar (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/1.bar (stored 0%)

Funktioniert!
Versuchen Sie es noch einmal mit Ihrem ersten Muster:

$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x \*.foo 
  adding: 1.bar (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/1.bar (stored 0%)

Funktioniert auch!

Also... schauen Sie sich genau an, was Sie da wirklich ausgeführt haben.

Zunächst könnten Sie die Option „ruhig“ entfernen -q, um die in meinen Beispielen angezeigten Standardmeldungen auszublenden.
Fügen Sie im nächsten Schritt die -vOption „ausführlich“ hinzu, um weitere Details anzuzeigen – vielleicht zu viele, aber vielleicht können Sie etwas Interessantes entdecken.


Aus den Kommentaren entnehme ich, dass das Entfernen -qbereits geholfen hat;

Das zugrunde liegende Problem bestand darin, dass der zum Testen verwendete Zip-Befehl durch die Existenz der Ausgabedatei geändert wurde.
Technisch gesehen hatte er sich sogar selbst geändert ...

Ausman zip:

Command format.  The basic command format is

               zip options archive inpath inpath ...

        where archive is a new or existing zip archive and inpath is a directory or
        file path optionally including wildcards.  When given the name of an exist‐
        ing zip archive, zip will replace identically named entries in the zip  ar‐
        chive (matching the relative names as stored in the archive) or add entries
        for new names.

verwandte Informationen