Почему «ls -l» сообщает физический размер каталога, а логический размер файла?

От man rsync

--delete Это указывает rsync на удаление лишних файлов с принимающей стороны (те, которых нет на стороне отправки), но только для каталогов, которые синхронизируются. Вы, должно быть, попросили rsync отправить весь каталог (например, "dir" или "dir/") без использования подстановочного знака для содержимого каталога (например, "dir/*"). поскольку подстановочный знак расширяется оболочкой, и rsync, таким образом, получает запрос на передачу отдельных файлов, а не их родительского каталог. Файлы, которые исключены из передачи, также также исключаются из удаления, если вы не используете опцию --delete-excluded или пометить правила как соответствующие только передающей стороне (см. модификаторы include/exclude в разделе FILTER RULES).

Поэтому я думаю, что это должно быть

rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --delete \
$(OUTPUTDIR)/ \
$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) \
--cvs-exclude --exclude=/.well-known

(предполагая, что .well-known находится в корне $(SSH_TARGET_DIR)/)

4
08.04.2018, 16:27
2 ответа

Вообще-то, ls сообщает все, что говорит ему ядро: оно не делает ничего разного относительно размера в зависимости от того, является ли файл каталогом). А Linux сообщает логический размер. Но логический размер каталога - не очень интересное свойство: он зависит от формата файловой системы.

Тип файловой системы по умолчанию в большинстве дистрибутивов Linux - ext4, и, вероятно, именно его вы используете. Ext4 выделяет целые блоки под каталоги и управляет пространством внутри этих блоков по своему усмотрению. Он даже не освобождает блоки, если каталог уменьшается (dir1 будет иметь 9 блоков, даже если вы удалите все файлы в нем). На вопрос о размере файла, который является каталогом, ext4 возвращает размер, выделенный для каталога, а это всегда целое число блоков.

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

1
27.01.2020, 20:59

Это особенность файловых систем ext2 / ext3 / ext4 , они сообщают размер каталогов в полных блоках. Если вы попробуете то же самое с XFS, вы увидите более мелкий размер.

На самом деле это не имеет значения. Для файлов важен «логический» размер, поскольку приложение может зависеть от знания размера файла вплоть до байта: конечный мусор может иметь значение, или некоторая структура данных может быть размещена в позиции относительно конца файл (например, архивы .zip).

Для каталогов «логический» размер не имеет значения, поскольку внутренняя структура хорошо известна, а в Linux программа пользовательского пространства не может даже напрямую читать содержимое каталога. Вместо этого чтение должно проходить через системные вызовы, сделанные специально для этой цели. И эти системные вызовы будут иметь дело с внутренней структурой каталога.

1
27.01.2020, 20:59

Теги

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