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

Komentarze

  • możesz użyć gzip -r myfolder, który rekursywnie rozpakuje pliki. W ten sam sposób możesz rozpakować pliki za pomocą gunzip -r myfolder, który rozpakuje pliki rekurencyjnie. Aby uzyskać więcej informacji, man gzip
  • Użyj tar; obsługuje opcje kompresji . gzip został zaprojektowany jako uzupełnienie tar, a nie jako zamiennik.
  • Pamiętaj, że @ val0x00ff ' prawie na pewno nie jest tym, co chcesz osiągnąć.
  • @Shadur, że ' dlatego opublikowałem ją jako comment, ponieważ to nie była odpowiedź na jego pytanie.
  • Aby pokazać, co oznacza @Shadur. Podane pliki 1 i 2 w folderze playground . gzip -r ./playground da ci 1.gz i 2.gz (i nie będzie już 1 i 2 plików) w folderze playground, a NIE w spakowanym pliku, który zawiera wszystko.

Odpowiedź

Nie.

W przeciwieństwie do zip, gzip działa jako algorytm kompresji tylko .

Z różnych powodów, z których niektóre nawiązują do ery napędów taśmowych, Unix używa programu o nazwie tar do archiwizacji danych, które następnie mogą być kompresowane programem kompresującym na przykład gzip, bzip2, 7zip itd.

W aby „skompresować” katalog, prawidłowe polecenie brzmiałoby

tar -zcvf archive.tar.gz directory/ 

To powie tar do

  • skompresuj go przy użyciu algorytmu z (gzip)

  • c (utwórz) archiwum z plików w directory (tar jest domyślnie rekurencyjny)

  • v (verbosely) list (on / dev / stderr więc nie ma to wpływu na polecenia potokowe) wszystkie pliki, które dodaje do archiwum.

  • i zapisuje dane wyjściowe jako f (plik) o nazwie archive.tar.gz

Polecenie tar oferuje obsługę gzip (za pośrednictwem flagi -z) wyłącznie dla Twojej wygody . Polecenie / lib gzip jest całkowicie oddzielne. Powyższe polecenie jest w rzeczywistości takie samo, jak

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

Aby zdekompresować i rozpakować archiwum do bieżącego katalogu, którego użyjesz

tar -zxvf archive.tar.gz 

To polecenie jest praktycznie takie samo, jak

gunzip < archive.tar.gz | tar -xv 

tar ma wiele, wiele, WIELE innych opcji i zastosowań; Serdecznie polecam kiedyś przeczytanie jego strony podręcznika.

Komentarze

  • Żeby było jeszcze wyraźniej, jest to dokładnie równoważne z tar -cv directory | gzip > archive.tar.gz. Powstałe archiwum można następnie wypakować za pomocą tar -zxvf lub nawet zcat file.tar.gz | tar -xv. Chodzi o to, że tar jest całkowicie niezależny od gzipa, więc polecenie tar zawiera tylko obsługę gzip dla wygody.
  • Używałem tar cvzf od dłuższego czasu. jedna uwaga: jeśli używasz systemu Windows (7-zip do określenia) do rozpakowania pliku *.tar.gz, zajmuje to dwie rundy. Jeden do rozpakowania *.tar.gz pliku do pliku *.tar, a następny do rozpakowania tego pliku tar do oryginalnej zawartości. wydłuża całkowity czas rozpakowywania, szczególnie w przypadku dużych plików (np. logów)
  • Czy nazewnictwo archiwum ma wpływ na cokolwiek z punktu widzenia maszyny? Wiem, że byłoby miło poinformować ludzi o algorytmie pierwotnie użytym do skompresowania pliku (stąd .gz), ale poza tym, czy tak naprawdę ma znaczenie, jak nazwiesz archiwum?
  • @hello_there_andy To nie czyni różnica w stosunku do większości uniksów, ale okna (i uzupełnianie kart inteligentnych w Linuksie) będą przyjmować założenia na podstawie rozszerzenia nazwy pliku.
  • @vadimkotov To może być to, co ' re szukam: superuser.com/questions/168749/…

Odpowiedź

Polecenie gzip nie kompresuje rekurencyjnie katalogu do pojedynczego pliku zip, gdy używasz -r. 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 gzip polecenie

$ gzip -r dir1 

after

$ 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ć polecenia tar, a następnie skompresować wynikowy .tar plik.

$ 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 

Odpowiedź

Odpowiedź na pytanie „Czy mogę spakować cały folder za pomocą programu gzip [w systemie Linux]?” polega na tym, że możesz użyć programu zip zamiast gzip, ze składnią:

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

Komentarze

  • @JeffSchaller: To jest odpowiedź. Jest to bardzo błędne (wydaje mi się), ale najwyraźniej jest odpowiedzią.
  • @ize: I ' Jestem pewien, że wydane przez Ciebie polecenie nie działa, w rzeczywistości użyj gzip.
  • Punkty za używanie zip, tak jak w zadanym pytaniu, najprawdopodobniej autor chciałby wiedzieć, że ' jest możliwe DOKŁADNE TO SAMA RZECZ, co robił na oknach. To smutne, że większość ludzi nie ' nie chce myśleć tak daleko.
  • Jest to trudne, gdy pytanie precyzuje… „używając gzip”.
  • I ' popieram tę odpowiedź, ponieważ uważam, że produkt (plik zip) jest prawdopodobnie ważniejszy niż metoda (przy użyciu gzip).

Odpowiedź

Napisałem skryptem 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 może potencjalnie usunąć ważne dane, jeśli zostanie użyty w niecodzienny sposób).

Jak używać:

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

Utworzy /home/MyDirectory.tgz i usunie MyDirectory w przypadku sukcesu (!!!).

ungzipdir /home/MyDirectory.tgz

Utworzy / home / MyDirectory i usunie /home/MyDirectory.tgz po pomyślnym zakończeniu.

Komentarze

  • Aby spakować WSZYSTKIE pliki w katalogu: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (uważaj na polecenie znajdź, przetestuj je z -exec echo {} najpierw i upewnij się, że ' nie przechwytujesz ' ./' co spowoduje spakowanie katalogu PARENT, prawdopodobnie zepsując cały katalog domowy)

Odpowiedź

Polecam używanie pigz ( Równoległa implementacja GZip )

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

Komentarze

  • Używam go też często (i pixz), ale czy to działa, gdy w grę wchodzą potoki i przekierowanie wyjścia?

Odpowiedź

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

tar -cvf - dir | gzip > dir.tar.gz 

Odpowiedź

Aby uzyskać kompletność, jeśli chcesz tarować plik w bac kground, użyj odpowiedzi @Shadur „i na końcu dodaj &:

tar -zcvf archive.tar.gz directory/ & 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *