Яке число між дозволом файлу та власником у виведенні команди ls -l?


35

Вихід ls -lкоманди дає такий результат:

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

Яке поле числа між дозволом файлу та власником? тобто що таке 1, 1, 1 і 2 ? Я перевірив, --helpале це не пояснює.

[EDIT] Я думав, що це кількість файлів у каталозі, але це не так. Дивіться зображення. "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

Посилання з іншогоFolder / на 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, як правило, файл - це деякий запис у таблиці файлів. Існують різні типи файлів: звичайні файли, пристрої, посилання символів, двері, труби, розетки, каталоги ...

Число inode (яке ви можете побачити у висновку ls -i) - це індекс у цій таблиці.

Тепер ви не маєте доступу до файлів по inode, але по шляху . Шлях являє собою ланцюжок з каталогу записів. Ви помітите, що ми тут не говоримо про папку, а про каталог . Тому що це те, що це каталог (подумайте про телефонний каталог).

Каталог - це особливий вид файлу, який дає імена ряду входів. Запис у каталозі - це відображення від імені до inode.

Даний файл (inode) може мати більше одного імені в одному каталозі (так само, як може бути більше одного імені за номером телефону), а також може мати імена (записи) у більш ніж одному каталозі. Вони називаються посиланнями, також відомими як жорсткі посилання для розрізнення з м'якими посиланнями (особливий тип файлу, який є вказівником на шлях).

Файл (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.

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

Деякі файлові системи на зразок btrfsвідходять від традиційної структури каталогів. Ви помітите, що кількість посилань на каталоги у btrfsфайлових системах завжди одна, навіть якщо ці каталоги містять "."запис із тим самим номером inode, що і вони в них.

Факт, що кількість посилань традиційно становить 2 плюс кількість підкаталів, має своє використання. Наприклад, у:

find . -name '*.c' -print

Якщо .не містить підкаталогів, але містить мільйони файлів. Перевіривши кількість посилань ., findможна знати, що немає підкаталогу. Тому все, 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.