Próbuję spakować folder w systemie unix. Czy można to zrobić za pomocą polecenia gzip?
Komentarze
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 nawetzcat file.tar.gz | tar -xv
. Chodzi o to, że tar jest całkowicie niezależny od gzipa, więc polecenietar
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/ &
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
tar
; obsługuje opcje kompresji .gzip
został zaprojektowany jako uzupełnienietar
, a nie jako zamiennik.comment
, ponieważ to nie była odpowiedź na jego pytanie.1
i2
w folderzeplayground
.gzip -r ./playground
da ci1.gz
i2.gz
(i nie będzie już1
i2
plików) w folderzeplayground
, a NIE w spakowanym pliku, który zawiera wszystko.