Какая сделка с & ldquo;. & Rdquo; и & ldquo; .. & rdquo; в каталогах? [Дубликат]

Если проблема возникает в первую очередь во время входа в систему, одним из вариантов является отсрочка Liferea до тех пор, пока остальные процессы входа в систему не успокоятся:

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

Если проблема связана исключительно с использованием ЦП, подумайте о том, как запустить Lifearea под cpulimit:

Как уменьшить время, затраченное на регистрацию, откладывая или задерживая некоторые запущенные приложения?
1
задан 11 November 2015 в 04:42

4 ответа

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

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

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

То же самое верно для .., это способ обратитесь к родительскому каталогу. Например. [F9].

17
ответ дан 23 May 2018 в 15:53

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

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

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

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

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

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

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

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

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

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

12
ответ дан 23 May 2018 в 15:53
  • 1
    В традиционных системах имена . и .. не являются виртуальными, но вполне реальными. Я не думаю, что все изменилось настолько, что они действительно виртуальны. – Jonathan Leffler 11 November 2015 в 17:17
  • 2
    Вы правы , но если вы перейдете в точку монтирования и сделаете ls -ali, вы увидите, что есть запись .., которая правильно показывает индексный дескриптор родительского каталога, даже если он установлен в другая файловая система - подразумевая, что даже когда эти записи хранятся на диске, Linux также генерирует их «на лету», так что .. работает через границы файловой системы. – thomasrutter 11 November 2015 в 18:35
  • 3
    Это правда - и тогда происходит обман. Во всех обычных каталогах (те, которые не являются корнем файловой системы) записи в точках и точка-точка являются реальными, а сообщения inodes являются реальными. Когда вы находитесь в корне монтированной файловой системы, номер inode точки с точкой-точкой подделывается системой как особый случай. В размонтированной файловой системе вы обнаружите, что точки с точкой и точкой с точкой имеют индекс inode 2 (опять же, по старым правилам, может существовать современный тип файловой системы, где правило отличается, но они имеют одинаковые номер inode). – Jonathan Leffler 11 November 2015 в 20:07
  • 4
    Спасибо, что научил меня чему-то новому - я изменил свой ответ – thomasrutter 17 November 2015 в 04:04

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

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

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

Как показало thomasrutter, в качестве обычных записей в каталоге вы можете использовать . и .. на пути. Например, ./-filename можно использовать, чтобы избежать интерпретации символа тире - в качестве введения параметров командной строки. Путь 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 и . в /tmp/testdir1 есть 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   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 May 2018 в 15:53
  • 1
    Просто вещь: эти записи не являются виртуальными, они фактически существуют в большинстве файловых систем unix. Особенно интересны комментарии к ответу thomasrutter на ядро, специально предназначенное для их монтирования. – spectras 11 November 2015 в 20:42
  • 2
    @spectras: Спасибо! Первоначально я думал, что ответ thomasrutter был настолько убедительным :) --- Я исправил свой ответ, и я добавил демонстрацию, что в ext4 . и .. находятся реальные записи в каталоге, хранящиеся в файловой системе. – pabouk 12 November 2015 в 19:15

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

foo
└── bar

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

3
ответ дан 23 May 2018 в 15:53

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

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