Каков «порядок каталогов» файлов в каталоге (используется `ls -U`)?


19

Согласно man-странице для ls, ls -Uозначает:

не сортировать; список записей в порядке каталога.

Что означает «порядок каталогов» и как он определяется?

Следующий тест (выполненный в файловой системе ext3) показывает, что это не тот порядок, в котором файлы были созданы:

root@sv1010vm0007:/tmp# mkdir test
root@sv1010vm0007:/tmp# touch test/2
root@sv1010vm0007:/tmp# touch test/1
root@sv1010vm0007:/tmp# touch test/3
root@sv1010vm0007:/tmp# ls -U test
2  3  1

Ответы:


14

Это зависит от файловой системы. Для некоторых файловых систем (среди них ext3) каталог на самом деле представляет собой файл с хорошо известным форматом, и бит «d» устанавливается в его разрешениях или режиме. В этом случае может иметь значение история того, какой длины имена файлов были созданы и удалены. Ядро заполнит первую запись в файле каталога, в которой достаточно места для хранения имени нового файла. См. Http://e2fsprogs.sourceforge.net/ext2intro.html для более подробной информации, раздел под названием «Физическое описание».

Для некоторых других файловых систем, в том числе Reiserfs, каталог - это просто некоторые записи в дереве B +, которые не видны в файловой системе, поэтому обычный lsкаталог в файловой системе Reiserfs находится в лексическом порядке.


@ Брюс: Итак, что именно содержит этот файл "каталога"?
Фахим Митха

Традиционно, что-то очень похожее на struct dirent, которое я определил в /usr/include/bits/dirent.h для блока RHEL и для блока Slackware 11.0. Обе эти машины отказываются открывать () каталог напрямую. Я знаю, что раньше я делал такие вещи, как «cat.> Dot.as.file», чтобы конвертировать каталог в обычный файл, я думаю, последний раз, когда я делал это наверняка, был Solaris 8. По сути, struct dirent содержит индекс (число), длину записи, длину имени и строку, которая, насколько я помню, может заканчиваться или не заканчиваться ASCII-Nul.
Брюс Эдигер

@ Брюс: Хорошо. И этой структуре C удается получить всю информацию о файлах и подкаталогах, которые она содержит, в эти поля?
Фахим Митха

Каталог в файловых системах, таких как ext2, BSD FFS или исходная файловая система Unix, просто содержит список номеров инодов и соответствующих им имен файлов. Вызывая «ls» без аргументов, вы получили список имен файлов. Если бы вы выполнили команду «ls -l», сама «ls» проверила бы каждое имя файла, выполнив системный вызов stat (2) для имени файла и из struct stat, получив разрешения, размер, «тип файла» и т. Д. Таким образом, нет, файл каталога не имеет всей информации, только список имен.
Брюс Эдигер

2
ext2.sourceforge.net/2005-ols/paper-html/node3.html объясняет, что функция dir_index хэширует имя файла и секрет, специфичный для файловой системы. dump2efs включает dir_index в строку функций файловой системы, если эта функция включена.
Мартин Дорей

3

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


В ядре и драйверах файловой системы существуют алгоритмы планирования / кэширования, которые влияют на точную запись данных на диск. Это сделано для увеличения производительности. Из-за этой оптимизации вы не можете точно сказать, когда произойдет запись. Кроме того, старые inode в файловых системах могут использоваться повторно, поэтому новые файлы могут появляться в слотах каталогов, где находились старые файлы. Так что порядок создания не обязателен, «порядок каталогов».
LawrenceC

@ultrasawblade: Не уверен, почему вы написали это как комментарий к моему собственному ответу, а не сам по себе или что-то еще.
Jlliagre

@ultrasawblade: Строго говоря, «старые inode'ы [будучи повторно использованными]» не имеют ничего общего с повторным использованием старых слотов каталогов. Это может происходить всякий раз, когда старые записи каталога не связаны; если они все жесткие ссылки, это не должно приводить к освобождению inode.
G-Man говорит: «Восстанови Монику»

2

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


-1

Каталог - это просто еще один файл, в котором перечислены метаданные реальных файлов. "ls -U" просто перечисляет записи в том же порядке в файле каталога.

Порядок определяется ОС и реализацией файловой системы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.