Как сжать файлы на месте?

20

У меня есть машина с 90% использования жесткого диска. Я хочу сжать более 500 файлов журнала в новый файл меньшего размера. Однако жесткий диск слишком мал, чтобы хранить как исходные, так и сжатые файлы.

Поэтому мне нужно сжать все файлы журнала в один новый файл один за другим, удаляя каждый оригинал после сжатия.

Как я могу сделать это в Linux?

Zen
источник
Дубликат: superuser.com/questions/378230
Герман

Ответы:

18

gzipили bzip2сожмет файл и автоматически удалит несжатый (это их поведение по умолчанию).

Однако имейте в виду, что в процессе сжатия оба файла будут существовать.

Если вы хотите сжать файлы журнала (т.е. файлы, содержащие текст), вы можете предпочесть bzip2, так как он имеет лучшее соотношение для текстовых файлов.

bzip2 -9 myfile       # will produce myfile.bz2

Сравнение и примеры:

$ 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

UPDATE, как @Jjoao сказал мне в комментарии, интересно, xzкажется, имеет лучшее соотношение для простых файлов с параметрами по умолчанию:

$ xz -9 myfile

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

Для получения дополнительной информации, вот интересный тест для различных инструментов: http://binfalse.de/2011/04/04/comparison-of-compression/

В приведенном выше примере я использую -9наилучшую степень сжатия, но если время, необходимое для сжатия данных, важнее, чем соотношение, лучше его не использовать (используйте более низкую опцию, т. Е. -1Или что-то среднее).

apaul
источник
2
+1; Просто любопытно: не могли бы вы добавить xz myfile?
JJoao
2
@JJoao спасибо! Интересно, я не привык использовать xz, но сейчас подумаю. Смотрите обновление моего поста.
apaul
3
Пожалуйста, не делай xz -9. Это значительно увеличивает объем памяти, необходимый для сжатия / распаковки, без существенного улучшения степени сжатия. На man-странице даже сказано (выделение их): «В частности, не стоит слепо использовать -9 для всего, как это часто бывает с gzip (1) и bzip2 (1)». Значение по умолчанию xz -6достаточно хорошее и даже xz -0/ xz -1обычно сжимает лучше, чем gzip -9.
user49740
@ user49740 ты прав. Я редко использую -9, но я использовал это здесь, так как я хотел сделать некоторый эталон для степени сжатия "в том же масштабе". Но опять же, вы абсолютно правы: это плохая идея, чтобы слепо использовать -9.
apaul
15

Я сам нашел решение для дегтя.
Он удаляет один файл после сжатия его в целевой файл.
Однако скорость сжатия не совсем высокая. Команда выглядит так:

tar -zcvf my_log.tar.gz *.log --remove-files
Zen
источник
1
Хороший ол ол. +1
Аарон Холл
1

В дополнение к @apaul, я подчеркиваю, что сжатие файлов индивидуально

 bzip2 *.log.*

(замените bzip2 на gzip, xz или какой-либо другой ваш любимый файл zip) может быть важно:

Таким образом, вы по-прежнему можете видеть ( bzcat file.bz2), искать ( bzgrep file.bz2), редактировать ( vi file.bz2) сжатый файл и удалять старые, когда это необходимо.

JJoao
источник
1

Я пытался сделать это на BSD-версии tar. В этом случае опция --remove-files недоступна. В итоге я сделал (и работал):

find folder_to_tar -type f -exec tar --append --file=output_tar_file.tar {} \; -exec rm -v {} \;
pgilmon
источник
Кстати, версия BSD - это то, что вы получаете по умолчанию, если вы используете MacOS
pgilmon