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.

Jake
quelle
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).
Lars Kotthoff
quelle
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

Vikas Tawniya
quelle
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).
Dan D.
quelle
18

Etwas verwandt - ich suchte nach einer Lösung, um dasselbe für Verzeichnisse zu tun. Leider -jfunktioniert die Option dafür nicht :(

Hier ist eine gute Lösung, wie Sie dies erreichen können: /superuser/119649/avoid-unwanted-path-in-zip-file

flockig
quelle
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.

MirkoBanchi
quelle
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
AndrewD
quelle
0

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

zip -jrm /path/to/file.zip /path/to/file
Qader Dorosti
quelle
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