Kann ich mit gzip einen ganzen Ordner komprimieren?


407

Ich versuche einen Ordner in Unix zu komprimieren. Kann man das mit dem gzip Befehl machen?


6
Sie können verwenden, gzip -r myfolderwelche Dateien rekursiv gzipen. Auf die gleiche Weise können Sie Dateien gunzip -r myfolder entpacken, wobei Dateien rekursiv entpackt werden. Für weitere Informationen man gzip
Valentin Bajrami

12
Verwenden Sie tar; Es unterstützt Optionen für die Komprimierung. gzipist als Ergänzung tarund nicht als Ersatz gedacht .
Devnull

13
Beachten Sie, dass der Vorschlag von @ val0x00ff mit ziemlicher Sicherheit nicht das ist, was Sie erreichen möchten.
Shadur

4
@ Shadur deshalb habe ich es gepostet, commentda das nicht die Antwort auf seine Frage war.
Valentin Bajrami

2
Demostrieren, was @Shadur bedeutet. Gegebene Dateien 1und 2unter Ordner playground. gzip -r ./playgroundSie erhalten 1.gzund 2.gz(und nicht mehr 1und 2Dateien) unter Ordner playground, NICHT eine gezippte Datei mit allem darin.
Jeff Xiao

Antworten:


660

Nein.

Im Gegensatz zu zip, gzipfungiert als Kompressionsalgorithmus nur .

Aus verschiedenen Gründen , von denen einige in der Zeit der Bandlaufwerke hören, verwendet Unix ein Programm namens tarDaten zu archivieren, die dann mit einem Komprimierungsprogramm komprimiert werden können , wie gzip, bzip2, 7zipusw.

Um ein Verzeichnis zu "zipen", wäre der richtige Befehl

tar -zcvf archive.tar.gz directory/ 

Dies wird sagen tarzu

  • komprimiere es mit dem z (gzip) Algorithmus

  • c (Erstellen) eines Archivs aus den Dateien in directory( tarist standardmäßig rekursiv)

  • v (ausführlich) Auflisten (unter / dev / stderr, damit Pipe-Befehle nicht betroffen sind) aller Dateien, die dem Archiv hinzugefügt werden.

  • und speichern Sie die Ausgabe als f (Datei) mit dem Namenarchive.tar.gz

Der tarBefehl bietet gzipUnterstützung (über die -zFlagge), die nur Ihrer Bequemlichkeit dient. Der gzipBefehl / lib ist völlig unabhängig. Der obige Befehl ist effektiv der gleiche wie

tar -cv directory | gzip > archive.tar.gz

Zum Dekomprimieren und Entpacken des Archivs in das aktuelle Verzeichnis, das Sie verwenden würden

tar -zxvf archive.tar.gz

Dieser Befehl ist im Grunde derselbe wie

gunzip < archive.tar.gz | tar -xv

tarhat viele, viele, VIELE andere Möglichkeiten und Verwendungen; Ich empfehle von Herzen, die Manpage irgendwann durchzulesen.


51
Nur um die Dinge noch deutlicher zu machen, ist dies genau gleichbedeutend mit tar -cv directory | gzip > archive.tar.gz. Das resultierende Archiv kann dann mit tar -zxvfoder sogar extrahiert werden zcat file.tar.gz | tar -xv. Da der Teer völlig unabhängig von gzip ist, enthält der tarBefehl aus Bequemlichkeitsgründen nur gzip-Unterstützung.
Patrick

Ich benutze es tar cvzfschon eine ganze Weile. Eines ist zu beachten: Wenn Sie 7-zipeine *.tar.gzDatei mit Windows ( muss angegeben werden) entpacken , dauert es zwei Runden. Eine, um die *.tar.gzDatei in eine *.tarDatei zu entpacken , die nächste, um die TAR-Datei in den ursprünglichen Inhalt zu entpacken. Es erhöht die gesamte Entpackzeit, insbesondere für große Dateien (z. B. Protokolle)
Jeff Xiao

1
Hat die Benennung des Archivs maschinelle Auswirkungen? Ich weiß, dass es nett wäre, die Leute über den Algorithmus zu informieren, der ursprünglich für das Zip-Verfahren verwendet wurde (daher .gz), aber ansonsten spielt es tatsächlich eine Rolle, wie Sie das Archiv benennen.
Hallo_Hier_undy

3
@hello_there_andy Es macht keinen Unterschied zu den meisten Unixen, aber Windows (und die Vervollständigung von Smart Tabs unter Linux) gehen von Annahmen aus, die auf der Dateinamenerweiterung basieren.
Shadur

1
@vadimkotov Dies könnte das sein , was Sie suchen: superuser.com/questions/168749/...
Shadur

47

Der gzipBefehl komprimiert ein Verzeichnis bei Verwendung des -rSchalters nicht rekursiv in eine einzelne ZIP-Datei . Vielmehr wird diese Verzeichnisstruktur durchlaufen und jede gefundene Datei in eine separate Datei komprimiert.

Beispiel

Vor

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

Führen Sie jetzt den gzipBefehl aus

$ gzip -r dir1

nach

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

Wenn Sie die Verzeichnisstruktur lieber tarkomprimieren möchten, möchten Sie wahrscheinlich den Befehl verwenden und dann die resultierende .tarDatei komprimieren .

$ tar zcvf dir1.tar.gz dir1/

Beispiel

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3

Was zu folgender Einzeldatei führt:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

Sie können den Inhalt bestätigen:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3

4

Ich habe diese 2 Befehle geschrieben:

gzipdir:

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi

ungzipdir:

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi

(!!!) Bitte vor der Verwendung testen (da es ein 'rm -f' gibt, das möglicherweise wichtige Daten entfernen kann, wenn es auf ungewöhnliche Weise verwendet wird).

Wie benutzt man:

cd /home/; gzipdir MyDirectory oder gzipdir /home/MyDirectory

Erstellt /home/MyDirectory.tgz und entfernt MyDirectory bei Erfolg (!!!).

ungzipdir /home/MyDirectory.tgz

Erstellt / home / MyDirectory und entfernt /home/MyDirectory.tgz bei Erfolg.


So komprimieren Sie ALLE Dateien in einem Verzeichnis: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (Gehen Sie vorsichtig mit dem Befehl find um, testen Sie ihn -exec echo {}zuerst mit und stellen Sie sicher, dass Sie nicht './' erfassen, wodurch das Verzeichnis PARENT komprimiert wird und möglicherweise Ihr gesamtes Ausgangsverzeichnis beschädigt wird.)
Andrew Lorien

1

Ich empfehle pigz( Parallele Implementierung von GZip )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz


Ich benutze es auch oft (und Pixz), aber funktioniert es, wenn Pipes und Ausgabeumleitung ins Spiel kommen?
Michael Wolf

1

Die Antwort auf die Frage "Kann ich einen ganzen Ordner mit zip unter Linux komprimieren?" Lautet wie folgt:

zip -r <zip file name> <folder to zip>

Wenn Sie eine neue Frage haben, fragen Sie es bitte durch Klicken Frage stellen Taste. Fügen Sie einen Link zu dieser Frage hinzu, wenn dies zur Bereitstellung des Kontexts beiträgt. - Aus der Bewertung
Jeff Schaller

2
@ JeffSchaller: Dies ist eine Antwort. Es ist sehr falsch (glaube ich), aber es ist eindeutig eine Antwort.
Scott

1
@ize: Ich bin mir ziemlich sicher, dass der Befehl, den Sie gepostet haben, gzip nicht verwendet.
Dhag

1
Punkte für die Verwendung von zip wie die gestellte Frage, höchstwahrscheinlich hätte der Autor gerne gewusst, dass es möglich ist, genau dasselbe zu tun, was er früher unter Windows getan hat. Es ist traurig, dass die meisten Menschen nicht so weit denken möchten.
Florian Heigl

2
Es ist schwierig, wenn in der Frage angegeben wird, dass ... "mit gzip".
Jeff Schaller

1

Wenn Sie die Datei im Hintergrund tarieren möchten, verwenden Sie der Vollständigkeit halber die Antwort von @ Shadur und fügen Sie &am Ende Folgendes hinzu :

tar -zcvf archive.tar.gz directory/ &

0

Wenn Ihr Linux-Tar diese -zOption nicht unterstützt , können Sie Folgendes verwenden:

tar -cvf - dir | gzip > dir.tar.gz
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.