Frage von davidmueller13Usermod Junior, 56

Wie kann ich unter Linux Ordnerinhalte als zip-Datei packen?

Der komplette Inhalt eines Ordners soll als Zip-Archiv gepackt werden.Mit zip -r beispieldatei.zip Pfad/zu/Ordner wird allerdings der Ordner selbst gepackt, sprich Ordnername/beispieldateien.Wie lautet der Befehl, wenn ich alle Dateien packen möchte, die sich in einem Ordner befinden?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Linuxhase, Community-Experte für PC, 50

Hallo

Wie kann ich unter Linux Ordnerinhalte als zip-Datei packen?

Auf einem GNU/Linux-System ist ZIP nicht die erste Wahl, die lautet nämlich TAR

man zip schreibt:

-U (--copy) option).
-b path-x file file ... @
-i files-K Attempt to convert the names and paths to conform to MS Windows. Behaviour similar to
-k but long names
-n suffixes
-O output-file
-P password
-s splitsize
-t mmddyyyy-m option) no input files are removed.
-x files-Z cm

und man tar

-A, --catenate, --concatenate
-c, --create
-d, --diff, --compare
-r, --append
-t, --list
-u, --update
-x, --extract, --get
-g, --listed-incremental=FILE-G, --incremental
-n, --seek-S, --sparse
-k, --keep-old-files
-U, --unlink-first
-W, --verify
-O, --to-stdout
-m, --touch
-p, --preserve-permissions, --same-permissions
-s, --preserve-order, --same-order
-f, --file=ARCHIVE
-F, --info-script=COMMAND, --new-volume-script=COMMAND
-L, --tape-length=
-M, --multi-volume
-b, --blocking-factor=BLOCKS
-B, --read-full-records
-i, --ignore-zeros
-H, --format=FORMAT
-V, --label=TEXT
-a, --auto-compress
-I, --use-compress-program=COMMAND
-j, --bzip2
-J, --xz
-z, --gzip, --gunzip, --ungzip
-Z, --compress, --uncompress
-C, --directory=DIR
-h, --dereference
-K, --starting-file=MEMBER
-N, --newer=DATE, --after-date=DATE
-P, --absolute-names-T, --files-from=FILE
-X, --exclude-from=FILE
-l, --check-links
-R, --block-number
-v, --verbose
-w, --interactive, --confirmation
-o When creating, same as --old-archive. When extracting, same as --no-same-owner.

Kurzform by Linuxhase-Script

Linuxhase

Kommentar von Linuxhase ,

Bei mir tut das dieses Kommando:

zip -r /home/linuxhase/zipfile.zip *

es wird in /home/linuxhase eine Datei zipfile.zip erstellt aus allen Dateien des Verzeichnisses in welchem ich mich gerade befinde. Alternativ kann man den Pfad natürlich auch angeben:

zip -r /home/linuxhase/zipfile.zip /home/linuxhase/Downloads/*

es wird in /home/linuxhase eine Datei zipfile.zip erstellt aus allen Dateien welche sich im Verzeichnis Downloads befinden.

Noch raffinierter ist es so:

tar -xvf zipfile.tar /home/linuxhase/Downloads/* | zip zipfile.zip -

Damit wird zuerst mit TAR ein Archiv zipfile.tar erstellt, welches danach von ZIP komprimiert wird.

Linuxhase

Antwort
von TeeTier, 53

Folgendes in eine Datei (z. B. zip.sh) kopieren, ausfürbar machen, und dann mit "./zip.sh beispiel.zip /pfad/zu/ordner" aufrufen:

#!/bin/bash

if [ "$#" -ne "2" ]; then
echo 'USAGE: zip.sh OUTFILE INDIR'
exit 1
fi

out_file=`readlink -f $1`
in_dir=`readlink -f $2`

pushd $in_dir
zip -rv $out_file .
popd

Als einzeiler kannst du auch Folgendes eingeben:

pushd /pfad/in ; zip -r /pfad/out.zip . ; popd

Dabei musst du dann aber auf absolute Pfadangaben achten, aber diese Arbeit nimmt dir das komplette Skript im ersten Beispiel ab.

Bei TAR ist es deutlich einfacher, da du dabei einfach einen -C switch angeben kannst.

Viel Spaß! :)

Kommentar von TeeTier ,

PS: Wenn du - wie aus dem anderen Kommentar ersichtlich - ein Skript für Backups basteln willst, dann solltest du (gerade unter *ix-Systemen) TAR anstelle von ZIP benutzen:

tar -cjvfhW test.tar.bz2 -C /tmp/foo/ .

Die Switches: c erzeugt ein neues Archiv, j jagt alles durch die BZip2 Kompression (besser als Zip und GZip), v gibt die aktuell verarbeiteten Dateien aus, f erzwingt ein Überschreiben bei bereits vorhandener Archivdatei, h löst symbolische Verknüpfungen auf und W überprüft am Ende das ganze Archiv noch einmal zusätzlich auf Korrektheit.

Das C ganz am Ende wechselt in das Verzeichnis, welches fortan als Wurzel dienen soll, die NICHT in den Pfaden der zu archivierenden Dateien erscheint. Und der Punkt ganz am Schluss steht für eben dieses Verzeichnis und dessen gesamten Inhalt (also alle Dateien und Ordner). :)

Du solltest TAR immer ggü. ZIP bevorzugen, da bei letzterem die Dateiattribute nicht mit gespeichert werden!

Kommentar von TeeTier ,

PS: j verträgt sich natürlich nicht mit W, also W nur dann benutzen, wenn keine Kompression vorliegt!

Antwort
von schiz0, 56

Moin

Habe ein Beispiel gefunden :

Ihre gesamten Websites liegen gesammelt im Verzeichnis /srv/www. Dort sind sie zum Beispiel standardmäßig bei Opensuse***. Um die Web-Inhalte nun in Ihr Homeverzeichnis zu packen, geben Sie ein:

zip -r ~/websites.zip /srv/www

***muss nicht zwingend OpenSuse sein

Eventuell hilft die das weiter

Quelle: strassenprogrammierer.de/linux-packen-tar-zip_tipp_590.html

Kommentar von davidmueller13 ,

Leider passiert dann genau das, was ich oben beschrieben habe. Der Ordner wird gepackt, nicht nur der Inhalt. Sprich in der Zip ist www/<> anstatt <>.

Kommentar von schiz0 ,

Dann  musst das eventuell so aussehen zip -r ~/websites.zip /svr/www/site1 site2 usw. warum machst du das ganze nicht in einem Dateimanager? Dateien markieren, rechtsklick und (je nach Distro) "Archiv erstellen" "Hier packen" "zu Archiv hinzufügen" oder was auch immer bei dir steht.

mfg

Kommentar von davidmueller13 ,

Ich benötige den Befehl für ein Shellskript und da sich die Dateien in diesem Ordner variabel sind, führt das einzeln Auswählen leider nicht zum Ergebnis.

Kommentar von schiz0 ,

Ok, sorry aber damit kenne ich mich nicht wirklich aus. Schau mal hier : http://www.strassenprogrammierer.de/shell-programmieren-mit-bash-scripts-unter-l...

Da steht weiter unten

***Bislang haben Sie nur interne Fähigkeiten der Bash-Scripts kennen gelernt. Noch raffinierter wird es aber, wenn Sie auch noch externe Programme in Ihre Scripts einbinden. Bauen Sie Ihr Skript doch in eine kleine Backup-Maschine um. Die packt die ihr übergebenen Daten in ein Archiv und schreibt das aktuelle Datum mit in den Archiv-Namen hinein.

#!/bin/bash

# Einfaches Backup-Script

SIKFILEPRE=${HOME}/sicherung

SIKFILENAME=${SIKFILEPRE}_`date +%Y%m%d`.tar

if [ $# -lt 1 ]; then

    echo "Fehler: Kein Dateiname eingegeben"

    echo "Benutzung: $0 datei.ext [datei2.ext] [datei.ext]"

    exit 1

else

    echo ${SIKFILENAME} wird erzeugt

    tar -cvf ${SIKFILENAME} "$@"

    if [ $? -eq 0 ]

    then

        echo Dateien erfolgreich gesichert

    else

        echo Fehler bei Datensicherung

        exit 2

    fi

    gzip $SIKFILENAME

fi

Eventuell findest du auf der Seite eine Lösung für dein Script.

mfg

Keine passende Antwort gefunden?

Fragen Sie die Community