O motivo da existência e o uso de .
e ..
.
e ..
são entradas que estão normalmente presentes em todos os diretórios . Seu significado não está relacionado ao diretório de trabalho de um processo (como shell), mas ao diretório em que a entrada está.
..
fornece ligação bidirecional da estrutura da árvore de diretórios, enquanto .
é um nome conveniente para se referir ao próprio diretório. O caminho directory/.
é igual a directory
. Teoricamente, uma string vazia poderia ter sido escolhida para se referir ao diretório em si, mas na verdade não é assim: ls ''
não funciona e o significado de uma string vazia seria ambíguo porque no início do caminho se refere a o diretório raiz já: Será que /file1
significa file1
no diretório raiz ou file1
no diretório de trabalho atual?
Como thomasrutter mostrou, é importante que, como entradas de diretório normais, você possa usar .
e ..
em um caminho. Por exemplo, ./-filename
pode ser usado para evitar a interpretação do caractere de traço -
como uma introdução às opções de linha de comando. O caminho directory1/../directory2
em vigor é o mesmo que ./directory2
, que é o mesmo que directory2
.
Por que .
e ..
estão ocultos?
Os nomes de arquivos (e diretórios) com .
no início são por convenção ocultos em sistemas semelhantes a Unix, portanto, por padrão, a maioria das ferramentas não mostrará os diretórios .
e ..
. Isso é útil porque já sabemos que .
e ..
estão normalmente presentes em todos os diretórios.
O comando ls -a
mostra todas as entradas do diretório. No Nautilus Ctrl + H ativa a exibição das entradas ocultas, mas com exceção de .
e ..
, porque normalmente elas não são muito úteis em um gerenciador de arquivos gráfico. Para um comportamento semelhante na linha de comando, você pode usar ls -A
.
As entradas de diretório .
e ..
real?
Sim, no sistema de arquivos comumente usado, eles são. (como Jonathan Leffler lembrou) Como podemos verificar isso?
# 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/..
O número do inode (1ª coluna) referente à estrutura de dados do diretório / arquivo em si é o mesmo para o mesmo diretório testdir1
e testdir1/.
. A contagem de links (terceira coluna) mostrando o número de entradas de diretório referentes ao inode (diretório / arquivo) é 2 logo após a criação do diretório, porque há testdir1
in /tmp
e .
in /tmp/testdir1
. O inode de /tmp/testdir1/..
( /tmp
) possui 14 links porque possui 12 subdiretórios contendo ..
+ as 2 entradas como todos os diretórios.
# 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
O utilitário debugfs
lê os dados do sistema de arquivos ext2 (e mais recentes) diretamente dos setores de disco (ignorando o sistema de arquivos no kernel do 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
Se você não acredita na listagem de diretórios de debugfs
, é possível examinar o dump bruto do diretório e verificar se as entradas .
e ..
estão realmente presentes.