Qual é o problema com o "." e ".." nos diretórios? [duplicado]

7

Quando eu uso o nautilus para procurar um diretório (o exemplo específico neste é a pasta / media) não vejo nada, mas quando eu digito ls -a no terminal ele mostra:

. 
.. 

em azul. Estou ciente de que destaques azuis são diretórios e . e .. podem simbolizar diretórios pai e de trabalho, mas por que eles estão na pasta /media ?

    
por thinksinbinary 11.11.2015 / 01:24

5 respostas

4

Resposta curta: . refere-se ao seu diretório atual, .. refere-se ao diretório acima dele, também conhecido como diretório pai. /media é para montar coisas como USB e partições na sua unidade. A menos que você tenha anexado explicitamente um USB ou montado algo lá, esse diretório permanecerá vazio.

    
por Sergiy Kolodyazhnyy 11.11.2015 / 01:33
17

Se o Nautilus não mostrar nada e ls -a mostrar apenas . e .. , então não há nada nesse diretório.

Diretório . representa o diretório atual, é uma maneira de referenciar arquivos e diretórios usando um caminho relativo. Por exemplo. ./subdir1/subdir2/somefile

Quando você dá o comando ls , sob o capô isso é traduzido em ls .

O mesmo é verdadeiro para .. , é uma maneira de referenciar o diretório pai. Por exemplo. ../../etc/cron.d .

    
por NZD 11.11.2015 / 01:34
12

Essas duas entradas são integrantes dos sistemas de arquivos em sua máquina e estão presentes na lista retornada pelas funções de listagem de diretórios de baixo nível do kernel.

Como outros já disseram, .. é um link para o diretório pai, e . é um link para o diretório atual.

Alguns front-ends, como o nautilus, ocultam essas duas entradas, porque elas não são tão relevantes em um ambiente gráfico, mas ainda estão lá.

Por que eles existem?

Estes são atalhos por conveniência. Eles são implementados em todo o seu sistema de arquivos para garantir que, independentemente do aplicativo que você esteja usando, eles funcionem - eles não dependem de suporte individual a aplicativos. Eles funcionam em qualquer lugar que um caminho de diretório é permitido, incluindo arquivos de configuração.

  • O atalho .. permite que você se refira ao pai de um diretório com directory/.. , seu avô usando directory/../.. e assim por diante.

  • O atalho . permite que você se refira explicitamente ao diretório atual, nos casos em que um aplicativo exige que você especifique um diretório (ou diretórios) para pesquisar e deseja pesquisar no diretório diretório atual.

    Por exemplo, . pode ser adicionado à variável de ambiente PATH , permitindo que o diretório atual seja pesquisado por executáveis correspondentes por padrão. Ou, se não existir em PATH , você poderá usar ./myscript para executar um script no diretório atual, mesmo que a variável de ambiente PATH não procure no diretório atual um executável.

Como eles são implementados

Na maioria dos sistemas de arquivos tradicionais, as entradas . e .. são implementadas no disco como entradas de diretório que compartilham um inode com os diretórios para os quais apontam - ou seja, são como < em> hard links para o diretório atual e pai, exceto que eles não podem ser excluídos ou modificados.

Com a ajuda do kernel do sistema operacional, a entrada .. também funciona nos pontos de montagem, garantindo que a raiz de um ponto de montagem tenha uma entrada .. implementada como um link para o diretório pai onde a montagem reside . Isso acontece independentemente dos tipos de sistema de arquivos - isso aconteceria mesmo em sistemas de arquivos virtuais como /proc .

. e .. são nomes de arquivos reservados - não é possível criar um arquivo ou diretório real e atribuir . ou .. como nome (embora você possa iniciar um nome de arquivo com esses caracteres).

    
por thomasrutter 11.11.2015 / 05:23
4

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.

    
por pabouk 11.11.2015 / 13:12
3

. é o diretório atual e .. é o diretório pai. Tome a seguinte hierarquia de diretórios como exemplo:

foo
└── bar

foo/. e foo/bar/.. são foo .

    
por Jane 11.11.2015 / 02:39