Czy mogę spakować cały folder za pomocą gzip?


407

Próbuję spakować folder w systemie Unix. Czy można to zrobić za pomocą polecenia gzip?


6
możesz użyć, gzip -r myfolderktóry będzie rekurencyjnie gzip plików. W ten sam sposób możesz rozpakować pliki, za pomocą gunzip -r myfolder którego rozpakujesz pliki rekurencyjnie. Aby uzyskać więcej informacji, man gzip
Valentin Bajrami

12
Użyj tar; obsługuje opcje kompresji. gzipjest zaprojektowany jako uzupełnienie tar, a nie jako zamiennik.
devnull

13
Zauważ, że sugestia @ val0x00ff prawie na pewno nie jest tym, co chcesz osiągnąć.
Shadur

4
@Shadur dlatego opublikowałem to, commentponieważ nie była to odpowiedź na jego pytanie.
Valentin Bajrami

2
Demostrate, co oznacza @Shadur. Podane pliki 1i 2w folderze playground. gzip -r ./playgroundda wam 1.gzi 2.gz(i nie więcej 1i 2pliki) w folderze playground, a nie spakowany plik ze wszystkim w nim.
Jeff Xiao,

Odpowiedzi:


660

Nie.

W przeciwieństwie zip, gzipfunkcjonuje jako algorytmu kompresji tylko .

Z różnych powodów, z których niektóre wysłuchaj powrotem do ery napędów taśmowych, Unix używa programu o nazwie tardo archiwizacji danych, które następnie mogą być skompresowane przy użyciu programu do kompresji jak gzip, bzip2, 7zip, itd.

Aby „spakować” katalog, poprawne byłoby polecenie

tar -zcvf archive.tar.gz directory/ 

Dzięki temu dowiesz tarsię

  • skompresuj go za pomocą algorytmu z (gzip)

  • c (utwórz) archiwum z plików w directory( tardomyślnie rekurencyjne)

  • v (pełna) lista (on / dev / stderr, aby nie wpływała na polecenia potokowe) wszystkie pliki dodane do archiwum.

  • i zapisz wynik jako plik f (plik) o nazwiearchive.tar.gz

tarKomenda oferuje gzipwsparcie (poprzez -zflagą) wyłącznie dla wygody użytkownika. gzipPolecenia / lib całkowicie oddzielne. Powyższe polecenie jest w rzeczywistości takie samo jak

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

Aby rozpakować i rozpakować archiwum do bieżącego katalogu, którego byś użył

tar -zxvf archive.tar.gz

To polecenie jest faktycznie takie samo jak

gunzip < archive.tar.gz | tar -xv

tarma wiele, wiele, WIELE innych opcji i zastosowań; Polecam serdecznie kiedyś przeczytać jego stronę podręcznika.


51
Żeby było jeszcze wyraźniej, jest to dokładnie równoznaczne z tar -cv directory | gzip > archive.tar.gz. Powstałe archiwum można następnie wyodrębnić za pomocą tar -zxvflub nawet zcat file.tar.gz | tar -xv. Zwracając uwagę, że tar jest całkowicie niezależny od gzip, tarpolecenie zawiera po prostu obsługę gzip dla wygody.
Patrick

używam tar cvzfod dłuższego czasu. jedna rzecz do zapamiętania: jeśli używasz systemu Windows ( 7-zipnależy określić) do rozpakowania *.tar.gzpliku, zajmuje to dwie rundy. Jeden do rozpakowania *.tar.gzpliku do *.tarpliku, następny do rozpakowania tego pliku tar do oryginalnej zawartości. zwiększa całkowity czas rozpakowywania, szczególnie w przypadku dużych plików (np. logów)
Jeff Xiao

1
Czy nazywanie archiwum wpływa na maszynę? Wiem, że fajnie byłoby poinformować ludzi o algorytmie pierwotnie używanym do skompresowania go (stąd .gz), ale poza tym, czy to w rzeczywistości ma znaczenie, jak nazwiesz archiwum?
hello_there_andy

3
@hello_there_andy Nie ma znaczenia dla większości uniksów, ale system Windows (i inteligentne uzupełnianie tabulatorów w systemie Linux) przyjmuje założenia na podstawie rozszerzenia nazwy pliku.
Shadur

1
@vadimkotov To może być to, czego szukasz: superuser.com/questions/168749/...
Shadur

47

gzipKomenda nie będzie rekurencyjnie skompresować katalog w jednym pliku zip, gdy za pomocą -rprzełącznika. Zamiast tego przejdzie tę strukturę katalogów i spakuje każdy znaleziony plik do osobnego pliku.

Przykład

przed

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

teraz uruchom gzippolecenie

$ gzip -r dir1

po

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

Jeśli wolisz spakować strukturę katalogów, prawdopodobnie będziesz chciał użyć tarpolecenia, a następnie skompresować .tarplik wynikowy .

$ tar zcvf dir1.tar.gz dir1/

Przykład

$ 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

Co daje następujący pojedynczy plik:

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

Możesz potwierdzić jego zawartość:

$ 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

Skryptowałem te 2 polecenia:

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

(!!!) Proszę przetestować przed użyciem (ponieważ istnieje „rm -f”, który potencjalnie może usunąć ważne dane, jeśli zostanie użyty w nietypowy sposób).

Jak używać:

cd /home/; gzipdir MyDirectory lub gzipdir /home/MyDirectory

Utworzy /home/MyDirectory.tgz i usunie MyDirectory po sukcesie (!!!).

ungzipdir /home/MyDirectory.tgz

Utworzy / home / MyDirectory i usunie /home/MyDirectory.tgz po sukcesie.


Aby skompresować WSZYSTKIE pliki w katalogu: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (uważaj na komendę find, -exec echo {}najpierw przetestuj i upewnij się, że nie przechwytujesz „./”, który spakuje katalog PARENT, prawdopodobnie psując cały katalog domowy)
andrew lorien

1

Polecam używać pigz( równoległe wdrożenie GZip )

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


Często go używam (i pixz), ale czy to działa, gdy zaczynają działać przekierowania potoków i wyjścia?
Michael Wolf,

1

Odpowiedź na pytanie „Czy mogę skompresować cały folder za pomocą zip na Linuksie?”, Należy użyć składni:

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

Jeśli masz nowe pytanie, zadaj je, klikając przycisk Zadaj pytanie . Dołącz link do tego pytania, jeśli pomaga to w zapewnieniu kontekstu. - Z recenzji
Jeff Schaller

2
@JeffSchaller: To jest odpowiedź. Jest to bardzo błędne (wierzę), ale wyraźnie jest odpowiedzią.
Scott

1
@ize: Jestem prawie pewien, że wysłane polecenie nie używa gzip.
dhag

1
Punkty za użycie zip jak zadane pytanie, najprawdopodobniej autor chciałby wiedzieć, że można ZRÓB TO SAMĄ RZECZ, tak jak to robił w systemie Windows. To smutne, że większość ludzi nie chce myśleć tak daleko.
Florian Heigl,

2
To trudne, gdy pytanie określa ... „używanie gzip”.
Jeff Schaller

1

Dla kompletności, jeśli chcesz spakować plik w tle, użyj odpowiedzi @ Shadur i dołącz &na końcu:

tar -zcvf archive.tar.gz directory/ &

0

Jeśli twój linux tar nie obsługuje tej -zopcji, możesz użyć następujących opcji:

tar -cvf - dir | gzip > dir.tar.gz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.