← Весь справочник

truncate и fallocate

Обрезать или увеличить файл до нужного размера, создать разреженный или заранее выделенный файл

truncate меняет размер файла: лишнее отрезает, недостающее дописывает нулями — но эти нули не занимают места на диске (файл становится разреженным, sparse). fallocate (из util-linux), наоборот, реально выделяет место под файл. Оба работают мгновенно, в отличие от dd. В песочнице — GNU coreutils 9.4 и util-linux.

Синтаксис

truncate -s РАЗМЕР файл…
truncate -r образец файл…
fallocate -l ДЛИНА файл
fallocate [-o СМЕЩЕНИЕ] -l ДЛИНА {-p|-c|-i|-z} файл
fallocate -d файл

Опции truncate

ОпцияЧто делает
-s РАЗМЕРустановить или изменить размер (формы — в таблице ниже)
-r файлвзять размер у другого файла; вместе с -s +N/-s -N — относительно него
-cне создавать отсутствующие файлы (без -c truncate создаёт файл)
-oсчитать РАЗМЕР в блоках ввода-вывода файла, а не в байтах

Формы размера

ЗаписьЧто значитПример: файл был 5000 байт
Nровно N-s 1000 → 1000
+Nувеличить на N-s +1K → 6024
-Nуменьшить на N-s -1000 → 4000
'<N'не больше N (уменьшить, если больше)-s '<2000' → 2000
'>N'не меньше N (увеличить, если меньше)-s '>8000' → 8000
/Nокруглить вниз до кратного N-s /4K → 4096
%Nокруглить вверх до кратного N-s %4K → 8192

Единицы: K, M, G, T — степени 1024; KB, MB, GB — степени 1000. < и > бери в кавычки — иначе это перенаправление оболочки.

Опции fallocate

ОпцияЧто делает
-l ДЛИНАсколько байт выделить (100M, 1G; MiB = M, MB — степени 1000)
-o СМЕЩЕНИЕс какого места файла (по умолчанию 0)
-nвыделить место, но не менять видимый размер файла (файл должен существовать)
-p«пробить дыру»: превратить диапазон в нули без места на диске (подразумевает -n)
-cвырезать диапазон, сдвинув остаток файла (ФС должна уметь; смещение и длина кратны блоку)
-iвставить пустой диапазон, сдвинув остаток вперёд
-zзаполнить диапазон нулями с выделением места
-dнайти блоки из нулей и сделать их «дырами» — сжать файл на месте
-xиспользовать posix_fallocate — работает везде, но медленно (пишет нули)
-vподробный вывод

Разреженный или выделенный

truncate -s 1G ffallocate -l 1G fdd if=/dev/zero … count=1024 bs=1M
ls -l (видимый размер)1.0G1.0G1.0G
du (место на диске)01.0G1.0G
Скоростьмгновенномгновеннопишет каждый байт
Место гарантированонет — может кончиться при записидада

Видимый и реальный размер сравнивают так: ls -lh f; du -h f или du -h --apparent-size f.

Примеры

# очистить файл, не удаляя его (права и владелец сохранятся)
truncate -s 0 app.log

# файл-заглушка на 1 ГиБ без расхода места — для тестов
truncate -s 1G big.img
ls -lh big.img; du -h big.img

# заранее зарезервировать 500 МиБ под данные
fallocate -l 500M data.bin

# своп-файл (место должно быть реально выделено, не sparse)
fallocate -l 1G /swapfile && chmod 600 /swapfile

# оставить первые 100 байт
truncate -s 100 file.txt

# дорастить до размера, кратного 4 КиБ (образы, выравнивание)
truncate -s %4K disk.img

# такой же размер, как у другого файла
truncate -r original.bin copy.bin

# сделать уже записанные нули «дырами» и освободить место
fallocate -d disk.img

Подводные камни

  • Обнуление лога, в который пишут без O_APPEND. Если процесс открыл файл через > (не >>), после truncate -s 0 он продолжит писать со старого смещения: в начале файла появятся нулевые байты, а размер вернётся к прежнему. Программы, открывшие лог в режиме дозаписи (>>), пишут правильно с нуля.
  • truncate создаёт файл, если его нет. Опечатка в имени не даст ошибки — появится новый пустой файл. Защита — -c.
  • Sparse-файл может «раздуться». cp --sparse=never, архиваторы без поддержки дыр, передача по сети превращают нули в реальные байты, и место на диске кончается неожиданно.
  • -s '<N' без кавычек — это -s и перенаправление ввода из файла N.
  • fallocate -n/-p на несуществующем файле — «cannot open … No such file or directory»: эти режимы файл не создают.
  • Не каждая ФС умеет fallocate (-c, -i требуют ext4/xfs). Там, где не умеет, — «Operation not supported»; поможет -x (медленно) или dd.
  • Обрезание необратимо. Отрезанные данные пропадают, truncate -s +N их не вернёт — допишет нули.

См. также

dd · df-du · rm · logrotate · stat · split · redirection