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


35

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

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

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

[РЕДАКТИРОВАТЬ] Я думал, что это было количество файлов в каталоге, но это не так. Смотрите изображение. «tempFolder» имеет 3 файла, но все еще показывает «2»

Ответы:


33

Примечание: редактируется после комментария @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

Ссылка с anotherFolder / на tempFolder / (которая есть ..) будет добавлена ​​в счетчик.



Поскольку он отображается между разрешениями и владельцем, создается впечатление, что это очень важно, но я никогда не использовал его. Когда это обычно нужно?
Эмануэль Берг

1
Это неверно Это количество ссылок, точка. Для каталогов у вас есть 2 для его записи в его родительском каталоге (как и любой файл) и .запись в себе, плюс один для ..записей в каждом из его подкаталогов.
Стефан Шазелас

@StephaneChazelas Вся документация, которую я нашел, говорит о жестком подсчете ссылок (например, linuxgazette.net/issue35/tag/links.html ). Также я обнаружил, что похожий вопрос был задан в AskUbuntu ( askubuntu.com/questions/19510/… ). Я проверю исходный код coreutils и посмотрю, смогу ли я найти точный ответ.
Дэмиен

2
@EmanuelBerg, когда файловые системы были гораздо менее надежны, чем сейчас, и вы работали над созданной вами файловой системой, lsмогли потратить 2 символа и дать вам больше информации, и не было ни stat(1)команды, find(1)ни fsck, ни символических ссылок, вероятно, это было гораздо более полезнее, чем сегодня. Его нельзя изменить, не взломав сценарии оболочки, авторы которых давно ушли в прошлое /dev/null; Так было по крайней мере с 1979 года.
Msw

8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

find . -name '*.c' -print

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


+1, отличный ответ :) Посмотрев исходный код ls, я заметил, что номер ссылки обновился после обращения к stat. Таким образом, команда stat даст вам значение ссылок для файла или каталога.
Дэмиен

Что значит иметь -вместо любого числа в месте после разрешения на ls -lвывод?
Шубхам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.