На этот вопрос уже есть ответ:
Когда я использую nautilus для просмотра каталога (конкретным примером в этом является папка / media), я ничего не вижу, но когда я набираю ls -a
в терминале он показывает:
.
..
синим цветом. Я знаю, что синим цветом выделены каталоги и .
и ..
могут символизировать родительский и рабочий каталоги, но почему они находятся в папке / media
?
Короткий ответ: .
относится к Вашему текущему каталогу, ..
обращается к справочнику выше его, иначе родительскому каталогу. /media
для установки материала как USB и разделение на Вашем двигателе. Если Вы явно не приложили USB или установили что-то там сами, тот справочник останется пустым.
Если Наутилус ничего не показывает и ls -a
только шоу .
и ..
, то нет ничего в том справочнике.
Справочник .
представляет текущий каталог, это - способ сослаться на файлы и справочники, используя относительный путь. Например, ./subdir1/subdir2/somefile
, Когда Вы даете команду ls
под капотом, это переведено на ls .
, то же верно для ..
, это - способ сослаться на родительский каталог. Например, ../../etc/cron.d
.
.
текущий каталог, и ..
родительский каталог. Возьмите следующую директивную иерархию в качестве примера:
foo
└── bar
foo/.
и foo/bar/..
foo
.
.
и ..
.
и ..
записи, которые обычно присутствуют в каждом каталоге. Их значение не связано с рабочим каталогом процесса (как оболочка), но к каталогу запись находится в.
..
обеспечивает двухстороннее соединение структуры дерева каталогов в то время как .
удобное название обращения к самому каталогу. Путь 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
можно исследовать необработанный дамп каталога и проверить что .
и ..
записи действительно там.
Эти две записи являются неотъемлемой частью файловых систем на Вашей машине и присутствуют в списке, возвращенном каталогом ядра низкого уровня, перечисляющим функции.
Поскольку другие сказали, ..
ссылка на родительский каталог, и .
ссылка на текущий каталог.
Некоторые фронтенды, такие как наутилус скрывают эти две записи, потому что они не действительно как релевантные в графической среде, но они все еще там.
Почему они существуют?
Это ярлыки для удобства. Они реализованы через Вашу целую файловую систему, чтобы гарантировать, что, неважно, какое приложение Вы используете, они будут работать - они не зависят от поддержки отдельного приложения. Они будут работать где угодно, который путь к каталогу позволяется, включая файлы конфигурации.
..
ярлык позволяет Вам обращаться к родителю каталога с directory/..
, его прародитель, использующий directory/../..
и так далее.
.
ярлык позволяет Вам явно обращаться к текущему каталогу в случаях, где приложение требует, чтобы Вы указали каталог (или каталоги) для поиска в, и Вы хотите искать в текущем каталоге.
Например, .
может быть добавлен к PATH
переменная среды, позволяя текущему каталогу искаться соответствие исполняемым файлам по умолчанию. Или, если это не существует в PATH
, можно использовать ./myscript
запускать скрипт в текущем каталоге, даже при том, что PATH
переменная среды иначе не посмотрела бы в текущем каталоге для исполняемого файла.
Как они реализованы
В большинстве традиционных файловых систем .
и ..
записи реализованы дисковые как записи каталога, которые совместно используют inode с каталогами, на которые они указывают на - то есть, они похожи на жесткие ссылки на текущий и родительский каталог, за исключением того, что они не могут быть удалены или изменены.
С помощью ядра операционной системы, ..
запись даже работает через точки монтирования, гарантируя, что корень точки монтирования будет иметь a ..
запись реализовала как ссылка на родительский каталог, где монтирование находится. Это происходит независимо от типов файловой системы - это произошло бы даже в виртуальных файловых системах как /proc
.
.
и ..
зарезервированные имена файлов - не возможно создать фактический файл или каталог и дать его .
или ..
как имя (хотя можно запустить имя файла с этих символов).