Что является соглашением с “.” и “..” в каталогах? [дубликат]

Этот вопрос уже имеет ответ здесь:

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

. 
.. 

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

7
задан 10 November 2015 в 17:42

5 ответов

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

4
ответ дан 23 November 2019 в 06:07

Если Наутилус ничего не показывает и ls -a только шоу . и .., то нет ничего в том справочнике.

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

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

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

17
ответ дан 23 November 2019 в 06:07

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

foo
└── bar

foo/. и foo/bar/.. foo.

3
ответ дан 23 November 2019 в 06:07

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

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

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

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

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

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

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

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

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

# 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 прямо после создания каталога, потому что существует testdir1 в /tmp и . в /tmp/testdir1. inode /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   t   e   s   f   i   l   e   1   s   o   c   k   e   t 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 можно исследовать необработанный дамп каталога и проверить что . и .. записи действительно там.

4
ответ дан 23 November 2019 в 06:07

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

Поскольку другие сказали, .. ссылка на родительский каталог, и . ссылка на текущий каталог.

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

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

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

  • .. ярлык позволяет Вам обращаться к родителю каталога с directory/.., его прародитель, использующий directory/../.. и так далее.

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

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

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

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

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

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

12
ответ дан 23 November 2019 в 06:07

Другие вопросы по тегам:

Похожие вопросы: