Как я могу сжать файл в Linux на месте, не используя дополнительное дисковое пространство?

У меня есть накопитель на 100 ГБ, в котором есть 95-гигабайтный файл. Мне нужно освободить место на диске (и прямо сейчас передача файла с диска не является вариантом). Файл будет хорошо сжиматься с помощью gzip или bz2 или что-то еще, но все эти программы записывают сжатый файл в отдельный файл. У меня недостаточно свободного места для этого.

Есть ли способ использования стандартных инструментов сжатия или других утилит Unix для сжатия файла без использования дополнительного дискового пространства (или, по крайней мере, минимального объема дополнительного дискового пространства)? Я представляю что-то, что сжимает часть файла за раз и записывает результаты непосредственно над файлом. Я понимаю, что это было бы рискованно, так как файл был бы поврежден, если бы сжатие было прервано, но я не думаю, что у меня есть выбор.

  • Как смонтировать сжатый ISO-образ?
  • Как сжать .pdfs в Word 2007?
  • Как я могу оценить наилучший выбор формата архива для сжатия файлов?
  • Windows: сжатие раздела жесткого диска ускорит доступ к диску?
  • Сжать файл в формате pdf?
  • Зашифрованные контейнеры сжатия, такие как ZIP и 7-Zip, сжимают или шифруют в первую очередь?
  • Файловая система, используемая для внешнего жесткого диска для использования с компьютерами Mac, Linux и Windows
  • Как я могу получать телефонные звонки на сервере Linux и скриптах в зависимости от числа нажатых?
  • Могу ли я запустить Linux на планшет Android?
  • Как полностью отключить процесс от терминала?
  • Как добавить новое ядро ​​в grub2
  • Как извлечь ISO на Linux без доступа root
  • 4 Solutions collect form web for “Как я могу сжать файл в Linux на месте, не используя дополнительное дисковое пространство?”

    Это доказательство концепции bash one-liner, но это должно заставить вас начать. Используйте на свой риск.

     truncate -s `gzip -c file | dd of=file conv=notrunc 2>&1 | sed -n '$ s/ .*$// p'` file mv file file.gz 

    Это работает путем передачи gz-данных в dd-процесс, который записывает его обратно в тот же файл. По завершении файл усекается до размера вывода gz.

    Это предполагает, что последняя строка вывода dd соответствует:

    4307 байт (4,3 kB) скопировано, 2,5855e-05 с, 167 Мбайт / с

    Где первое поле представляет собой целое число байтов. Это размер, в который файл должен быть усечен. Я не уверен на 100%, что выходной формат всегда один и тот же.

    Это не так, что gzip и bzip2 перезаписывают оригинал. Скорее, они записывают сжатые данные на диск в качестве нового файла, и если эта операция завершается успешно, они отсоединяют исходный несжатый файл.

    Если у вас достаточно ОЗУ, вы можете написать сценарий для временного сжатия файлов в файловой системе tmpfs , затем удалить оригинал на диске и заменить его на сжатую версию. Может быть, что-то вроде этого:

     # some distributions mount /dev/shm as tmpfs; replace with bzip2 if you prefer if gzip -q9c /full/disk/somefile > /dev/shm/somefile.gz then rm -f /full/disk/somefile && mv -i /dev/shm/somefile.gz /full/disk fi 

    Просто помните об использовании памяти, поскольку tmpfs – это, по сути, RAM-диск. Большой выходной файл может легко голодать в системе и вызывать другие проблемы для вас.

    Нет никакого инструмента, который работает таким образом, именно по той причине, которую вы даете. Мало кто хочет написать инструмент, который сознательно реализует рискованное поведение.

    Команды split и csplit могут использоваться для разделения большого файла на более мелкие части, а затем сжимать их индивидуально. Однако сборка была бы довольно трудоемкой.

    Давайте будем гением компьютера.