Jak skompresować wszystkie pliki we wszystkich podkatalogach w jednym skompresowanym pliku w bash

201

Możliwa duplikat:
zgrywanie zestawu katalogów i tworzenie skompresowanego pliku tar

W tym poście opisano, jak rozpakować każdy plik osobno w strukturze katalogów. Muszę jednak zrobić coś nieco innego. Muszę utworzyć jeden duży plik gzip dla wszystkich plików w określonym katalogu. Potrzebuję też móc określić wyjściową nazwę pliku skompresowanego (np. Files.gz) i zastąpić stary plik skompresowanego pliku, jeśli taki już istnieje.

Doug
źródło
gzipze swej natury kompresuje tylko jeden plik. Aby umieścić wiele plików w jednym pliku w celu późniejszego zgzipowania, użyj tar.
Thomas

Odpowiedzi:

387
tar -zcvf compressFileName.tar.gz folderToCompress

wszystko w folderToCompress przejdzie do nazwa_kompresu

Edycja: Po przejrzeniu i komentarzach zdałem sobie sprawę, że ludzie mogą się mylić z nazwa_pliku_pliku bez rozszerzenia. Jeśli chcesz, możesz użyć rozszerzenia .tar.gz (zgodnie z sugestią) z nazwa_kompresu

amitchhajer
źródło
2
Dzięki. Czy to wszystko skompresuje pod „folderToCompress” (tzn. Rekurencyjnie)?
Doug
2
wszystko w folderzeToCompress przejdzie do
nazwa_kompresu
80
Prawdopodobnie będziesz chciał wybrać, compressFileNamewięc zawiera .tar.gzrozszerzenie lub doprowadzisz wszystkich do szaleństwa.
zremisował
9
Działa to również dla dowolnej liczby katalogów, np. tar -zcvf two-dirs.tar.gz dir-one dir-twoUtworzy archiwum zawierające dwa katalogi.
Zoltán
5
Działa również z *kompresowaniem wszystkiego w bieżącym tar -zcvf all.tar.gz *
61

istnieje wiele metod kompresji, które działają rekurencyjnie w wierszu poleceń i dobrze jest wiedzieć, kto jest końcowym odbiorcą.

tzn. jeśli ma zostać wysłany do kogoś z systemem Windows, prawdopodobnie najlepiej będzie zip:

zip -r file.zip folder_to_zip

unzip filenname.zip

dla innych użytkowników Linuksa lub twoja własna tar jest świetna

tar -cvzf filename.tar.gz folder

tar -cvjf filename.tar.bz2 folder  # even more compression

#change the -c to -x to above to extract

Trzeba uważać na smołę i sposób, w jaki rzeczy są smołowane / wyodrębniane, na przykład, jeśli uruchamiam

cd ~
tar -cvzf passwd.tar.gz /etc/passwd
tar: Removing leading `/' from member names
/etc/passwd


pwd

/ home / moja nazwa użytkownika

tar -xvzf passwd.tar.gz

spowoduje to utworzenie / home / myusername / etc / passwd

niepewny, czy wszystkie wersje tar to robią:

 Removing leading `/' from member names
VH
źródło
18

Post @amitchhajer działa dla GNU tar. Jeśli ktoś znajdzie ten post i potrzebuje go do pracy w GNUsystemie NON , może to zrobić:

tar cvf - folderToCompress | gzip > compressFileName

Aby rozwinąć archiwum:

zcat compressFileName | tar xvf -
Jeremy J Starcher
źródło
2
Oprócz tego, że jest przenośny, to rozwiązanie jest przydatne, jeśli chcesz przekazać argumenty do gzip (np. --Test lub --best), ponieważ afaik nawet GNU tar nie zapewnia sposobu wysyłania argumentów do gzip.
Timothy Woods
Jest to wszechstronne, ponieważ można również używać innych sprężarek. Na przykład, pigzktóry jest szybszy, ponieważ może lepiej wykorzystać procesor (wielowątkowa implementacja zip).
Ortwin Angermeier