Какое число находится между правами доступа к файлу и владельцем в выводе команды ls -l?

Какое число находится между правами доступа к файлу и владельцем в выводе команды ls -l?

Вывод ls -lкоманды дает следующий результат:

введите описание изображения здесь

Что такое числовое поле между разрешением файла и владельцем? т.е. что это такое1, 1, 1 и 2? Я проверил, --helpно это не объясняет.

[EDIT] Я думал, что это количество файлов в каталоге, но это не так. Смотрите изображение. "tempFolder" имеет 3 файла, но все еще показывает "2"

решение1

Примечание: отредактировано после комментария @StephaneChazelas

Первый номер вывода ls -lпосле блока разрешений —количество жестких ссылок.

Это то же значение, что возвращает команда statв разделе «Ссылки».

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

АфайлОбычно имеет счетчик жестких ссылок, равный 1, но он меняется, если жесткие ссылки создаются с помощью lnкоманды. См.Справочное руководство Debian.

В вашем примере добавление жесткой ссылки для tempFile2 увеличит количество ссылок:

ln -l
ln tempFile2 tempHardLink
ln -l

ОбаtempFile2иtempHardLinkбудет иметь количество ссылок 2.

Если вы проделаете то же самое упражнение с символической ссылкой ( ln -s tempFile2 tempSymLink), значение счетчика не увеличится.

Акаталогбудет иметь минимальное количество 2 для '.'(ссылки на себя) и для записи в родительском каталоге.

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

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

Ссылка отдругойПапка/кtempFolder/(то есть ..) будет добавлено к счету.

решение2

В Unix, как правило, файл — это некоторая запись в таблице файлов. Существуют различные виды файлов: обычные файлы, устройства, символические ссылки, двери, каналы, сокеты, каталоги...

Номер инода (который вы можете увидеть в выводе ls -i) является индексом в этой таблице.

Теперь вы не получаете доступ к файлам с помощьюинодыно попуть. Апутьэто цепочкакаталогзаписи. Вы заметите, что мы не говорим опапкано изкаталогздесь. Потому что это то, чем является справочник (вспомните телефонный справочник).

Каталог — это особый вид файла, который дает имена нескольким инодам. Запись каталога — это отображение имени на иноду.

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

Файл (inode) отслеживает количество ссылок (записей в любом каталоге), которые у него есть, поэтому, когда это число достигает 0 (когда происходит отсоединение от последнего каталога, в котором на него ссылались), он освобождается.

Это то число (количество ссылок), которое отображается в ls -lвыводе.

Когда файл, не являющийся каталогом, создается в первый раз (с помощью системных вызовов openили creat(или bindили mknodдля некоторых типов файлов), это делается путем предоставления пути к новому файлу (например "/a/b"). Затем происходит следующее: выделяется новый файл и inode, и в каталог, связанный с именем "a"в "/"корневом каталоге, добавляется новая запись. Это начальныйсвязьпоэтому количество ссылок равно одному.

Дополнительные ссылки могут быть добавлены позже с помощью link()системного вызова ( lnкоманды). И ссылки могут быть удалены с помощью unlink()системного вызова ( rmкоманды).

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

Теперь, когда вы создаете каталог, вы вызываете mkdir()системный вызов. Что-то вроде mkdir("/a/b"). Затем он выделяет новый файл типа каталог. В этом новом каталоге он автоматически создает две записи:

  • "."(точкадлякаталог). Который является ссылкой на себя. Так что количество ссылок теперь равно 1.
  • ".."(длякаталог'sкаталог). Который является ссылкой на "/a". Таким образом, количество ссылок "/a"увеличивается на единицу

Затем этот новый каталог связывается с "/a"(для него добавляется запись "/a"), поэтому его количество ссылок теперь равно 2. Если "/a/b/c"каталог создается, то из-за ".."записи "/a/b/c"в количество ссылок "/a/b"станет равным 3.

Большинство Unix-систем ограничивают создание дополнительных ссылок на каталог, поскольку они могут вызывать проблемные циклы. Когда они разрешают a link()на каталог, обычно это может сделать только суперпользователь.

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

Тот факт, что количество ссылок традиционно равно 2 плюс количество подкаталогов, имеет свое применение. Например, в:

find . -name '*.c' -print

если .не содержит подкаталогов, но содержит миллионы файлов. Проверяя количество ссылок ., findможно узнать, что подкаталога нет. Поэтому все, что findнужно сделать, это прочитать содержимое каталога и сообщить записи, которые заканчиваются на .c(например, grep '\.c$'файл размером в несколько мегабайт, ничего страшного). В противном случае findпришлось бы проверять тип каждого отдельного файла, чтобы узнать, есть ли в нем каталоги, в которые можно спуститься (что приведет к такому же количеству lstat()системных вызовов). Конечно, этот вид оптимизации не работает на btrfs(хотя в современных версиях Linux тип файлов также сохраняется в записи каталога для некоторых файловых систем (включая btrfs) и возвращается getdents(2)системным вызовом, используемым для получения списка записей в каталоге, поэтому lstatон по-прежнему не нужен).

Связанный контент