Какая сделка с «.» И «..» в каталогах?

Когда я использую nautilus для просмотра каталога (конкретный пример в этом случае является папкой / media), я ничего не вижу, но когда я ls -a в терминале, он показывает:

 . .. 

в синем. Я знаю, что синие блики – это каталоги и . и .. могут символизировать родительские и рабочие каталоги, но почему они находятся в папке /media ?

Короткий ответ:. ссылается на ваш текущий каталог, .. ссылается на расположенную выше директорию, а также родительский каталог. /media предназначен для монтажа на вашем устройстве таких вещей, как USB и разделы. Если вы явно не подключили USB или не установили что-то там, этот каталог останется пустым.

Если Nautilus ничего не показывает, а ls -a показывает только . и .. , тогда в этом каталоге ничего нет.

Справочник . представляет текущий каталог, это способ ссылки на файлы и каталоги с использованием относительного пути. Например ./subdir1/subdir2/somefile

Когда вы даете команду ls , под капотом это переводится в ls .

То же самое верно для .. , это способ ссылки на родительский каталог. Например ../../etc/cron.d .

Эти две записи являются неотъемлемой частью файловых систем на вашем компьютере и присутствуют в списке, возвращенном функциями низкоуровневого каталога ядра.

Как говорили другие, .. является ссылкой на родительский каталог и . является ссылкой на текущий каталог.

Некоторые интерфейсы, такие как nautilus, скрывают эти две записи, потому что они не так актуальны в графической среде, но они все еще существуют.

Почему они существуют?

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

  • Ярлык .. позволяет ссылаться на родителя каталога с directory/.. , его дедушкой и бабушкой, используя directory/../.. и так далее.

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

    Например,. могут быть добавлены в PATH среды PATH , позволяя по умолчанию искать текущий каталог для соответствия исполняемых файлов. Или, если он не существует в PATH , вы можете использовать ./myscript для запуска скрипта в текущем каталоге, хотя PATH среды PATH иначе не выглядела бы в текущем каталоге исполняемого файла.

Как они реализованы

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

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

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

Причина существования и использования . и ..

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

.. обеспечивает двухстороннее связывание структуры дерева каталогов . является удобным именем для обращения к самому каталогу. directory/. путей directory/. это то же самое, что и directory . Теоретически пустая строка могла быть выбрана для обращения к самому каталогу, но на самом деле это не так: ls '' не работает, и значение пустой строки было бы неоднозначным, поскольку в начале пути, к которому оно относится, корневой каталог уже: Would /file1 означает file1 в корневом каталоге или file1 в текущем рабочем каталоге?

Как показало thomasrutter, важно, что в качестве обычных записей в каталоге вы можете использовать . и .. по пути. Например ./-filename можно использовать, чтобы избежать интерпретации символа тире - как введение параметров командной строки. ./directory2 directory1/../directory2 совпадает с ./directory2 который совпадает с directory2 .

Почему . и .. скрытый?

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

Команда ls -a показывает все записи в каталоге. В Nautilus Ctrl + H отображает скрытые записи, но, кроме . и .. потому что они обычно не очень полезны в графическом файловом менеджере. Для аналогичного поведения в командной строке вы можете использовать ls -A .

Есть . и .. реальные записи в каталоге?

Да, в часто используемой файловой системе они есть. (как напомнил Джонатан Леффлер) Как мы можем это проверить?

 # prepare the directory cd /tmp ; mkdir testdir1 # test 1 ls -lid testdir1 testdir1/. testdir1/.. 1179767 drwxrwxr-x 2 pabouk pabouk 4096 Nov 12 11:52 testdir1 1179767 drwxrwxr-x 2 pabouk pabouk 4096 Nov 12 11:52 testdir1/. 1179650 drwxrwxrwt 14 root root 4096 Nov 12 15:17 testdir1/.. 

Номер inode (1-й столбец), относящийся к структуре данных самого каталога / файла, одинаковый для одного и того же каталога testdir1 и testdir1/. , Количество ссылок (3-й столбец), показывающее количество записей в каталоге, относящихся к inode (директория / файл), равно 2 сразу после создания каталога, поскольку в /tmp есть testdir1 . in /tmp/testdir1 . /tmp/testdir1/.. ( /tmp ) имеет 14 ссылок, потому что у него есть 12 подкаталогов, содержащих .. + 2 записи как каждый каталог.

 # test 2 touch testdir1/tesfile1 # to have a regular file too debugfs /dev/sda2 -R 'ls -l /tmp/testdir1' | cat debugfs 1.42.12 (29-Aug-2014) 1179767 40775 (2) 1000 1000 4096 12-Nov-2015 11:52 . 1179650 41777 (2) 0 0 4096 12-Nov-2015 15:46 .. 1179771 100664 (1) 1000 1000 0 12-Nov-2015 11:52 tesfile1 

Утилита debugfs считывает данные файловой системы ext2 (и более новой) непосредственно из секторов диска (минуя файловую систему в ядре Linux).

 # test 3 debugfs /dev/sda2 -R 'dump /tmp/testdir1 '>(od -tax1) debugfs 1.42.12 (29-Aug-2014) 0000000 w nul dc2 nul ff nul soh stx . nul nul nul stx nul dc2 nul 77 00 12 00 0c 00 01 02 2e 00 00 00 02 00 12 00 0000020 ff nul stx stx . . nul nul { nul dc2 nul h si bs soh 0c 00 02 02 2e 2e 00 00 7b 00 12 00 e8 0f 08 01 0000040 tesfile 1 socket nul nul 74 65 73 66 69 6c 65 31 73 6f 63 6b 65 74 00 00 0000060 nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0010000 

Если вы не верите каталогу списка debugfs вы можете проверить исходный дамп каталога и проверить, что . и .. записи действительно есть.

. это текущий каталог и .. является родительским каталогом. В качестве примера возьмем следующую иерархию каталогов:

 foo └── bar 

foo/. и foo/bar/.. являются foo .