![Какое число находится между правами доступа к файлу и владельцем в выводе команды ls -l?](https://rvso.com/image/23927/%D0%9A%D0%B0%D0%BA%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0%20%D0%BA%20%D1%84%D0%B0%D0%B9%D0%BB%D1%83%20%D0%B8%20%D0%B2%D0%BB%D0%B0%D0%B4%D0%B5%D0%BB%D1%8C%D1%86%D0%B5%D0%BC%20%D0%B2%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B5%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20ls%20-l%3F%20.png)
Вывод 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
он по-прежнему не нужен).