Jak kompresować pliki w miejscu?

20

Mam komputer z 90% wykorzystaniem dysku twardego. Chcę skompresować ponad 500 plików dziennika do nowego, mniejszego pliku. Dysk twardy jest jednak zbyt mały, aby zachować zarówno oryginalne, jak i skompresowane pliki.

Więc potrzebuję skompresować wszystkie pliki dziennika do jednego nowego pliku jeden po drugim, usuwając każdy oryginalny raz skompresowany.

Jak mogę to zrobić w systemie Linux?

Zen
źródło
Duplikat: superuser.com/questions/378230
Hermann

Odpowiedzi:

18

gziplub bzip2skompresuje plik i automatycznie usunie nieskompresowany plik (jest to ich domyślne zachowanie).

Należy jednak pamiętać, że podczas procesu kompresji oba pliki będą istnieć.

Jeśli chcesz kompresować pliki dziennika (tzn. Pliki zawierające tekst), możesz preferować bzip2, ponieważ ma on lepszy stosunek do plików tekstowych.

bzip2 -9 myfile       # will produce myfile.bz2

Porównanie i przykłady:

$ ls -l myfile
-rw-rw-r-- 1 apaul apaul 585999 29 april 10:09 myfile

$ bzip2 -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 115780 29 april 10:09 myfile.bz2

$ bunzip2 myfile.bz2

$ gzip -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 146234 29 april 10:09 myfile.gz

AKTUALIZACJA, jak @Jjoao powiedział mi w komentarzu, co ciekawe, xzwydaje się mieć najlepszy stosunek do zwykłych plików z domyślnymi opcjami:

$ xz -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 109384 29 april 10:09 myfile.xz

Aby uzyskać więcej informacji, oto interesujący punkt odniesienia dla różnych narzędzi: http://binfalse.de/2011/04/04/comparison-of-compression/

W powyższym przykładzie używam -9najlepszego współczynnika kompresji, ale jeśli czas potrzebny na kompresowanie danych jest ważniejszy niż współczynnik, lepiej nie używaj go (użyj niższej opcji, tj. -1Lub czegoś pomiędzy).

apaul
źródło
2
+1; Ciekawe: czy możesz dodać xz myfile?
JJoao,
2
@JJoao dzięki! To ciekawe, nie jestem przyzwyczajony do używania xz, ale rozważę to teraz. Zobacz aktualizację mojego postu.
apaul
3
Proszę nie robić xz -9. To znacznie zwiększa pamięć wymaganą do kompresji / dekompresji, bez znaczącej poprawy współczynnika kompresji. Strona podręcznika mówi nawet (podkreślając swoją): „W szczególności nie jest dobrym pomysłem ślepe używanie opcji -9 do wszystkiego, co często ma miejsce w przypadku gzip (1) i bzip2 (1)”. Domyślnie xz -6jest wystarczająco dobry, a nawet xz -0/ xz -1zwykle kompresuje lepiej niż gzip -9.
user49740,
@ user49740 masz rację. Rzadko go używam -9, ale użyłem go tutaj, ponieważ chciałem zrobić jakiś test porównawczy dla współczynnika kompresji „w tej samej skali”. Ale znowu masz całkowitą rację: używanie na ślepo to zły pomysł -9.
apaul
15

Sam opracowałem rozwiązanie smoły.
Usuwa pojedynczy plik po skompresowaniu go do pliku docelowego.
Szybkość kompresji nie jest jednak dość duża. Polecenie wygląda następująco:

tar -zcvf my_log.tar.gz *.log --remove-files
Zen
źródło
1
Dobra smoła. +1
Aaron Hall
1

W uzupełnieniu do @apaul podkreślam, że kompresowanie plików indywidualnie

 bzip2 *.log.*

(zamień bzip2 na gzip, xz lub inny ulubiony plik zip) może być ważny:

W ten sposób nadal możesz zobaczyć ( bzcat file.bz2), wyszukać ( bzgrep file.bz2), edytować ( vi file.bz2) skompresowany plik i usunąć starsze, jeśli to konieczne.

JJoao
źródło
1

Próbowałem to zrobić w wersji tar tar BSD. W takim przypadku opcja --remove-files nie jest dostępna. Skończyło się (i pracowałem) to:

find folder_to_tar -type f -exec tar --append --file=output_tar_file.tar {} \; -exec rm -v {} \;
pgilmon
źródło
Nawiasem mówiąc, wersja BSD jest domyślnie dostępna, jeśli używasz MacOS
pgilmon