Quais são os diretórios ./ e ../?

13

Pergunta simples, mas não sei onde procurar e o Google não responde a períodos e barras.

Estou apenas tentando contar o número de arquivos & diretórios no diretório atual (não incluindo subpastas / arquivos) e estava tentando diferenciar ls -1 | wc -l e ls | wc -l , já que eles parecem idênticos. Um site que eu estava olhando disse "Tenha em mente que isso também está contando os diretórios ./ e ../." em relação ao com ls -1 , e não tenho certeza se isso significa inclui os diretórios antes ou algo assim (o que eu não quero), mas não parece fazer isso do teste.

Alguém poderia confirmar qual deles seria o mais adequado para contar o número de arquivos & diretórios no diretório atual somente (não sub) e o que eles significam pelos diretórios ./ e ../?

    
por Adam 30.01.2013 / 13:53

3 respostas

11

Todo diretório em um sistema Unix (e provavelmente todos os outros sistemas também) contém pelo menos duas entradas de diretório. Estes são . (diretório atual) e .. (diretório pai). No caso do diretório raiz, eles apontam para o mesmo local, mas com qualquer outro diretório, eles são diferentes. Você pode ver isso usando os comandos stat , pwd e cd (no Linux):

$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 548865      Links: 2
Device: 802h/2050d      Inode: 2670593     Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$

Observe que bin e sbin cada um tem dois links para ele. Uma é a entrada de diretório no diretório raiz e a outra é a entrada . dentro desse diretório.

Usar ls com um pipe para wc -l é um truque simples para contar o número de linhas na saída de ls. A suposição é que cada arquivo ou diretório ocupará exatamente uma linha na saída. O GNU ls, quando a saída é um não terminal, faz isso automaticamente; outros podem precisar da opção -1 para ativar o comportamento explicitamente. wc -l simplesmente conta e gera o número de linhas ( -l ) em sua entrada.

O problema com essa abordagem é que no Linux e nos sistemas de arquivos tradicionalmente usados no Linux, os nomes de arquivos e diretórios (eles são realmente um e o mesmo nesse sentido) são permitidos para conter caracteres de nova linha . Na presença destes, qualquer um dos métodos se desfaz - essas entradas serão contadas como duas ou mais entradas quando, na realidade, elas forem uma.

Contanto que você esteja usando o GNU ls, não tenha entradas de diretório com nomes que contenham caracteres de nova linha e não tenha aliases ímpares para ls (por exemplo, ls -a ), ambos exibirão a contagem de arquivos e diretórios o diretório atual (ou especificado). Para a maioria das pessoas, isso é bom o suficiente, mas não é válido no caso geral .

Se você precisa manipular os caracteres incomuns (principalmente as novas linhas) nos nomes das entradas de diretórios corretamente, sugiro usar a opção -b de ls para escapar deles. ls -1bA imprimirá cada nome de entrada de diretório em sua própria linha, escape de caracteres incomuns (para que cada entrada de diretório seja vista como um), incluindo quaisquer arquivos de pontos e diretórios. Ligue para wc -l para obter uma linha de comando completa de ls -1bA | wc -l , que informará o número de arquivos e diretórios no diretório atual (mas ignore . e .. ; essa é a diferença entre -a e -A ) , mas não descer em nenhum subdiretório. Se você não quiser que nenhum arquivo de ponto seja contado no total, simplesmente omita o parâmetro -A como ls .

    
por 30.01.2013 / 14:31
6

Para responder à pergunta no assunto:

Quando um diretório B é criado no Unix, ele é adicionado como uma nova entrada em outro diretório A (seu diretório pai) e, em B, duas entradas são adicionadas: uma chamada . como um link físico para si mesmo, e um chamado .. como link físico para A.

Esses são os únicos hard links para diretórios permitidos (embora algumas versões mais antigas de alguns Unices também permitissem links arbitrários).

é por isso que, com a maioria dos sistemas de arquivos ( btrfs sendo uma exceção notável), o número de links de um diretório é uma indicação de quantos subdiretórios ele possui (representando suas entradas .. ).

Ao renomear / mover um diretório, se for para o mesmo diretório (com um nome diferente), somente a entrada de nome em A será alterada. . e .. de B não são afetados. Mas se você mover um diretório diferente, então .. in B será alterado. Isso explica por que você pode renomear um diretório no qual você não tem acesso de gravação (supondo que você tenha acesso de gravação ao diretório pai) somente enquanto não o move para outro diretório (caso contrário, a necessidade de alterar o .. entry impede você de movê-lo).

Tenha cuidado, porém: /a/b/../c pode não ser o mesmo que /a/c porque /a/b pode ser um link simbólico para outro diretório.

Uma exceção a isso é quando esse caminho é dado ao comando cd para alguns shells. Aqueles cd s tratam .. logicamente ignorando as entradas .. nos diretórios. Um motivo pelo qual você frequentemente vê cd -P em scripts escritos corretamente, para desativar esse recurso que poderia causar confusão e inconsistências.

Para contar o número de entradas no diretório atual, excluindo . e .. com bash , você pode fazer:

shopt -s nullglob dotglob
set -- *
echo "$#"

Com zsh:

f=(*(ND))
echo $#f

Portável:

find . ! -name . -prune -print | grep -c /
    
por 30.01.2013 / 14:35
1

Eu não sou um grande especialista em Linux, mas eu conheço o Linux (costumava ser administrador há 16 anos atrás, no Slackware :) bons velhos tempos

os diretórios ./ e ../ são simples:. é o diretório atual, .. é o diretório anterior (na árvore do comando pwd -local directory -

Se contar, acho que eles adicionam 2 ao total da listagem, não realmente recursivamente e contam o diretório abaixo do atual, e também contam novamente o diretório atual (.):))

Então, basicamente, eu acho que adiciona o valor 2 para já contar (arquivos) no diretório atual.

Alguém me corrija se eu estiver errado.

Estou apenas postando para ajudar e visto que ninguém respondeu a esta pergunta, eles podem estar ocupados. Mas experimente e veja se você tem 10 arquivos e conte 12, então é isso.

    
por 30.01.2013 / 14:22