Когда делает 'ls печать - “0”

Для добавления вышеупомянутого ответа смотрите здесь. https://stackoverflow.com/questions/235839/how-do-i-indent-multiple-lines-quickly-in-vi

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

Мой любимый == автоматически сместить. 5== автоматически сместить 5 строк.

13
01.11.2011, 12:35
3 ответа

Очень интересное открытие. Хотя я никогда не использовал ls -s проверять, пуст ли файл или нет, я принял бы, о котором он сообщает 0 для пустых файлов, также.

К Вашему вопросу: Как Циновка, уже прокомментированная, покажите им свои результаты испытаний. Чтобы объяснить результаты им, заявите это ls -s сообщает сумма выделенных блоков в файловой системе, не фактический размер в байтах. Очевидно, некоторые реализации файловой системы выделяют блоки, даже если они не должны хранить данные вместо того, чтобы хранить просто Нулевого указателя в inode.

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

Но обычно созданный файл скоро получит некоторые данные, таким образом, разработчики определенного FS, возможно, предположили, что это окупается для непосредственного выделения блока данных после создания файла, поэтому когда первые данные прибывают, эта задача уже сделана.

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

Править:

Еще одна причина пришла на ум: файловые системы, где Вы нашли значения> 0, являются ZFS, реализация RAID+LVM+FS и GFS, кластерная файловая система. Обоим, вероятно, придется сохранить метаданные для поддержания целостности файлов, которая не хранится в inodes. Это могло быть это ls -s количества в блоках данных выделяются для этих метаданных.

6
27.01.2020, 19:53

В отличие от большинства (если не все) другие файловые системы, ZFS не предварительно выделяет статический массив inodes. Создание пустого файла на ZFS будет затем использовать новый блок данных, который является тем, о котором сообщают ls -s.

Я подозреваю, что GFS должен сохранить продвижение данных синхронизации/блокировки к другому не нулевой результат.

4
27.01.2020, 19:53

ls -s сообщает количество блоков, которые выделяются для файла, не включая то, что хранится непосредственно в записи каталога.

В большинстве случаев количество блоков является числом байтов, разделенных на размер блока в байтах, окруженных.

Количество блоков может быть меньше, чем это для редкого файла. Например, в большинстве файловых систем, это создаст 8 192-байтовый файл, охватывающий 0 блоков:

$ perl -e 'truncate STDOUT, 8192' >a
$ ls -l a
-rw-r--r-- 1 gilles gilles 8192 Nov  1 21:32 a
$ ls -s a
0 a

С другой стороны количество блоков может быть больше, если файловая система предварительно выделяет блоки для файлов или использует блоки для хранения метаданных. Я не удивлен, что Zfs имеет неочевидную корреспонденцию между размером файла и количеством блоков, учитывая большое количество функций, которые он предлагает и его ориентация на большие файловые системы; я не знаю детали, но количество блоков зависит не только от размера файлов, но также и на его истории (у Вас может быть больше чем один блок в пустом файле, если это - результат усечения большего файла).

Объяснить почему ls -s является неправильным: это не считает размер файла, но зависимое от файловой системы количество. Это - очень косвенный способ определить, пуст ли файл во-первых, требуя внешнего инструмента (ls) и некоторый парсинг; вместо этого, они должны использовать test -s, который не требует никакого парсинга и выполняет точно, что требуют. Если они думают это ls -s хороший путь состоит в том, чтобы протестировать, пуст ли файл, бремя должно быть на них для выравнивания по ширине этого, это работает.

2
27.01.2020, 19:53

Теги

Похожие вопросы