Erstellen Sie eine Zip-Datei und ignorieren Sie die Verzeichnisstruktur


216

Ich muss eine Zip-Datei mit diesem Befehl erstellen:

zip /dir/to/file/newZip /data/to/zip/data.txt

Dies funktioniert, aber die erstellte Zip-Datei erstellt eine Verzeichnisstruktur, die das Verzeichnis der Rohdatei nachahmt. Es sind viele zusätzliche Ordner, die ich nicht brauche.

Ich fand keine Antwort auf einen flüchtigen Blick über die Manpage oder eine Google-Jagd.



2
Ich dachte, diese Frage war älter als all diese anderen Stapelbörsen, aber leider ist der Beitrag des Superusers tatsächlich älter als dieser. Wenn ich hier etwas tun kann, um mich zu informieren. Dies muss eine heiße Antwort sein, da Google hier immer noch so viel Verkehr hat. : D
Jake

Antworten:


351

Sie können verwenden -j.

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).

19
Wenn -jes für Ihr Verzeichnis (zusammen mit -r) nicht funktioniert,
checken Sie

manchmal funktioniert es einfach nicht ... bevorzuge @czerasz link;) was im Grunde eine Pushd Popd Combo ist
TecHunter

36

Die Verwendung -jfunktioniert nicht mit der -rOption.
Die Problemumgehung dafür kann also folgende sein:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Oder Inline-Version

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

Sie können die Ausgabe an richten, /dev/nullwenn die cd -Ausgabe nicht auf dem Bildschirm angezeigt werden soll


Eigentlich möchten Sie vielleicht Folgendes tun:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 Wie macht es einen Unterschied? Vielmehr wird es Sie veranlassen, nein hinzuzufügen. von parentDir (..) für jedes Verzeichnis im Pfad: |
Vikas Tawniya

Das Ergebnis ist das gleiche, da stimme ich zu. In automatisierten Skripten, die in vielen verschiedenen Umgebungen ausgeführt werden, vermeiden Sie normalerweise globale Pfade, da Sie keine Ahnung haben, wie der globale Pfad aussehen wird. Aber aus dem können cd path/to/parent/dir/Sie die Anzahl der Doppelpunkte ../leicht berechnen .
eddyP23

@ eddyP23 macht Sinn
Vikas Tawniya

33

Verwenden Sie die -jOption:

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).


3

Alternativ können Sie einen temporären symbolischen Link zu Ihrer Datei erstellen:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Dies funktioniert auch für ein Verzeichnis.


1

Behalten Sie das übergeordnete Verzeichnis bei, damit unzipnicht überall Dateien ausgegeben werden

Wenn Sie beim Komprimieren von Verzeichnissen das übergeordnete Verzeichnis im Archiv belassen, können Sie vermeiden, dass Ihr aktuelles Verzeichnis beim späteren Entpacken der Archivdatei verschmutzt wird

Um zu vermeiden, dass alle Pfade beibehalten werden, und da Sie -j und -r nicht zusammen verwenden können (es wird eine Fehlermeldung angezeigt), können Sie stattdessen Folgendes tun:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

Das ../$(basename $PWD)ist die Magie, die das übergeordnete Verzeichnis beibehält.

So , jetzt unzip my.zipeinen Ordner geben alle Ihre Dateien enthält:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Anstatt das aktuelle Verzeichnis mit den entpackten Dateien zu verunreinigen:

file1
file2
dir1
├── file3
├── file4

0

Verwenden Sie einfach die -jrmOption, um die Datei- und Verzeichnisstrukturen zu entfernen

zip -jrm /path/to/file.zip /path/to/file

Seien Sie vorsichtig, -m --move Verschiebt die angegebenen Dateien in das Zip-Archiv. Dadurch werden die Zielverzeichnisse / -dateien gelöscht, nachdem das angegebene Zip-Archiv erstellt wurde. Wenn ein Verzeichnis nach dem Entfernen der Dateien leer wird, wird auch das Verzeichnis entfernt. Es werden keine Löschvorgänge durchgeführt, bis zip das Archiv ohne Fehler erstellt hat. Dies ist nützlich, um Speicherplatz zu sparen, ist jedoch möglicherweise gefährlich. Es wird daher empfohlen, ihn in Kombination mit -T zu verwenden, um das Archiv zu testen, bevor alle Eingabedateien entfernt werden.
Catalint
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.