Возникло множество проблем
Это вариант Как Linux управляет смещениями файлов . И ls
, и du
верны, они измеряют разные вещи.
При запуске truncate
размер файла уменьшается до 0 байт. Однако yes
немедленно записывает в него снова, со смещением, следующим за тем, где он записывался раньше; все отсутствующие данные заменяются нулями, а полностью отсутствующие блоки заменяются редко. В результате видимый размер файла продолжает увеличиваться, но фактическое место на диске, которое он занимает на диске, возвращается к 0 каждый раз, когда вы запускаете truncate
, и хотя он снова увеличивается, когда yes
записывает в него, разреженные блоки не учитываются.
ls
показывает видимый размер файла по умолчанию, тогда как du
показывает потребляемое дисковое пространство, поэтому ls
будет показывать большее значение, чем du
, после первого truncate
, при котором теряется целый блок. Вы можете заставить ls
показывать выделенный размер с флагом -s
.
Если вы попросите оболочку добавить к yeslog
(yes >> yeslog
), то файл будет открыт с O_APPEND
и yes
будет писать с начала файла после его усечения, вместо продолжения для записи с тем же смещением, что и раньше.