У меня есть диск на 100 ГБ, который имеет файл на 95 ГБ. Мне нужно освободить место на диске (и сейчас перенос файла с диска не возможен). Файл будет хорошо сжиматься gzip
или bz2
каким-либо другим образом, но все эти программы записывают сжатый файл в отдельный файл. У меня недостаточно свободного места для этого.
Есть ли способ использовать стандартные инструменты сжатия или другие утилиты Unix для сжатия файла без использования дополнительного дискового пространства (или хотя бы минимального дополнительного дискового пространства)? Я представляю что-то, что сжимает часть файла за раз и записывает результаты прямо в файл. Я понимаю, что это было бы рискованно, поскольку файл был бы поврежден, если сжатие было прервано, но я не думаю, что у меня есть выбор.
источник
Ответы:
Это доказательство концепции bash one-liner, но оно должно помочь вам начать. Используйте на свой риск.
Это работает путем передачи данных gz в процесс dd, который записывает их обратно в тот же файл. После завершения файл усекается до размера вывода gz.
Это предполагает, что последняя строка вывода dd соответствует:
Где первое поле является целым числом записанных байтов. Это размер, до которого файл нужно будет обрезать. Я не уверен на 100%, что формат вывода всегда один и тот же.
источник
conv=notrunc
это необходимо?gzip -c file | dd of=file
кажется, работает так же хорошо.gzip
) записывает больше байтов заголовка и данных, чем байтов исходных данных, таким образом перезаписывая некоторые части файла? Я думаю, это зависит от выбранной программы сжатия. Кто-нибудь знает, как предотвратить это или насколько (вероятно) это возможно?Это не так уж много,
gzip
иbzip2
переписать оригинал. Вместо этого они записывают сжатые данные на диск в виде нового файла, и, если эта операция завершается успешно, они отменяют связь с исходным несжатым файлом.Если у вас достаточно ОЗУ, вы можете написать скрипт для временного сжатия файлов в
tmpfs
файловой системе, а затем удалить оригинал на диске и заменить его сжатой версией. Может быть, что-то вроде этого:Просто помните об использовании памяти, так
tmpfs
как по сути это RAM-диск. Большой выходной файл может легко заморозить систему и вызвать другие проблемы для вас.источник
Нет инструмента, который бы работал таким образом, именно по той причине, которую вы даете. Мало кто готов написать инструмент, который намеренно реализует рискованное поведение.
источник
Команды split и csplit можно использовать для разбиения большого файла на более мелкие части, а затем для их индивидуального сжатия. Сборка будет довольно трудоемкой, хотя.
источник