Qual é o número entre a permissão de arquivo e o proprietário na saída do comando ls -l?

35

A saída do ls -lcomando produz o seguinte resultado:

insira a descrição da imagem aqui

Qual é o campo numérico entre a permissão do arquivo e o proprietário? ou seja, quais são esses 1, 1, 1 e 2 ? Eu verifiquei o --helpmas isso não explica.

[EDIT] Pensei que fosse o número de arquivos em um diretório, mas não é. Veja a imagem. "tempFolder" possui 3 arquivos, mas ainda mostra um "2"

KMC
fonte

Respostas:

33

Nota: editado após o comentário @StephaneChazelas

O primeiro número da ls -lsaída após o bloco de permissão é o número de links físicos .

É o mesmo valor que o retornado pelo statcomando em "Links".

Esse número é a contagem do arquivo físico, quando se refere a um arquivo, ou o número de entradas de diretório contidas, quando se refere a um diretório.

Um arquivo normalmente tem uma contagem de links físicos de 1, mas isso muda se os links físicos forem criados com o lncomando Veja o manual de referência da Debian .

No seu exemplo, adicionar um link físico para tempFile2 aumentará sua contagem de links:

ln -l
ln tempFile2 tempHardLink
ln -l

Ambos tempFile2 e tempHardLink terá uma contagem da ligação de 2.

Se você fizer o mesmo exercício com um link simbólico ( ln -s tempFile2 tempSymLink), o valor da contagem não aumentará.

Um diretório terá uma contagem mínima de 2 para '.'(link para si mesmo) e para a entrada no diretório de seu pai.

No seu exemplo, se você quiser aumentar a contagem de links do tempFolder , crie um novo diretório e o número aumentará.

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

O link de outra pasta / para tempFolder / (que é ..) será adicionado à contagem.

Damien
fonte
Como é exibido entre as permissões e a propriedade, você tem a impressão de que é muito importante, mas eu nunca o usei. Quando é tipicamente necessário?
Emanuel Berg
1
Isso está incorreto. É a contagem de links, ponto final. Para diretórios, você tem 2 para sua entrada no diretório pai (como qualquer arquivo) e a .entrada em si, mais uma para as ..entradas em cada um de seus subdiretórios.
Stéphane Chazelas
@StephaneChazelas Toda a documentação que encontrei fala sobre a contagem de links físicos (por exemplo, linuxgazette.net/issue35/tag/links.html ). Também descobri que uma pergunta semelhante foi feita no AskUbuntu ( askubuntu.com/questions/19510/… ). Vou verificar o código fonte do coreutils e ver se consigo descobrir a resposta exata.
Damien
2
@EmanuelBerg quando os sistemas de arquivos eram muito menos confiáveis do que são agora e que estava trabalhando no sistema de arquivos que você desenvolveu, e lspoderia passar 2 personagens e dar-lhe mais informações, e não havia nenhum stat(1)comando nem find(1)nem fsck, nem links simbólicos que era provavelmente muito mais útil do que é hoje. Ele não pode ser alterado sem quebrar os scripts de shell cujos escritores há muito tempo atrás /dev/null; Tem sido assim desde, pelo menos, 1979. #
317
8

No Unix, normalmente, um arquivo é uma entrada em uma tabela de arquivos. Existem diferentes tipos de arquivos: arquivos regulares, dispositivos, links simbólicos, portas, tubos, soquetes, diretórios ...

O número do inode (que você pode ver na saída de ls -i) é o índice nessa tabela.

Agora, você não acessa arquivos por inode, mas por caminho . Um caminho é uma cadeia de entradas de diretório . Você notará que não estamos falando de pasta, mas de diretório aqui. Porque é o que é um diretório (pense em um diretório de telefone).

Um diretório é um tipo especial de arquivo que dá nomes a vários inodes. Uma entrada de diretório é um mapeamento de um nome para um inode.

Um determinado arquivo (um inode) pode ter mais de um nome em um diretório (assim como pode haver mais de um nome em um número de telefone) e também pode ter nomes (entradas) em mais de um diretório. Esses são chamados de links também conhecidos como links físicos para distinguir com links flexíveis (um tipo especial de arquivo que é um ponteiro para um caminho).

Um arquivo (inode) controla o número de links (de entradas em qualquer diretório) que possui, para que quando o número atingir 0 (quando estiver sendo desvinculado do último diretório em que foi referenciado), ele seja desalocado.

Esse é o número (o número de links) que é exibido na ls -lsaída.

Quando um arquivo não-diretório é criado pela primeira vez (com o openou creat(ou bindou mknodpara alguns tipos de arquivos) chamadas do sistema), que é feito através do fornecimento com um caminho para o novo arquivo (como "/a/b"). O que acontece então é um novo arquivo e o inode é alocado e uma nova entrada é adicionada ao diretório associado ao "a"nome no "/"diretório raiz. Esse é o link inicial, portanto a contagem de links é uma.

Mais links podem ser adicionados posteriormente com a link()chamada do sistema (o lncomando). E os links podem ser removidos com a unlink()chamada do sistema (o rmcomando).

Você notará que os arquivos do diretório type geralmente têm um número de links maior ou igual a 2.

Agora, quando você cria um diretório, está chamando a mkdir()chamada de sistema. Algo como mkdir("/a/b"). O que ele faz é alocar um novo arquivo do tipo diretório. Nesse novo diretório, ele cria automaticamente duas entradas:

  • "."( ponto para diretório ). Qual é um link para si mesmo. Portanto, a contagem de links agora é 1.
  • ".."(para o diretório do diretório ). Qual é um link para "/a". Portanto, a contagem de links "/a"é incrementada em um

Em seguida, esse novo diretório é vinculado a "/a"(uma entrada é adicionada "/a"a ele); portanto, sua contagem de links agora é 2. Se um "/a/b/c"diretório for criado, devido à ".."entrada "/a/b/c", a contagem de links "/a/b"se tornará 3.

A maioria dos Unices restringe a criação de links adicionais para um diretório, porque eles podem causar loops problemáticos. Quando eles permitem um link()diretório, geralmente apenas o superusuário pode fazê-lo.

Alguns sistemas de arquivos, como btrfspartem dessa estrutura de diretório tradicional. Você notará que a contagem de links nos diretórios nos btrfssistemas de arquivos é sempre uma, mesmo que esses diretórios contenham uma "."entrada com o mesmo número de inode que eles mesmos.

O fato de a contagem de links ser tradicionalmente 2 mais o número de subdiretórios tem seu uso. Por exemplo, em:

find . -name '*.c' -print

Se .não contém subdiretórios, mas contém milhões de arquivos. Ao verificar a contagem de links de ., findpode saber que não há subdiretório. Portanto, tudo o que findprecisa fazer é ler o conteúdo do diretório e relatar as entradas que terminam em .c(como um grep '\.c$'arquivo de poucos megabytes, não é grande coisa). Caso contrário, findseria necessário verificar o tipo de cada arquivo para ver se há diretórios nos quais descer (resultando em tantas lstat()chamadas do sistema). Obviamente, esse tipo de otimização não funciona btrfs(embora nas versões modernas do Linux, o tipo de arquivo também seja armazenado na entrada do diretório para alguns sistemas de arquivos (inclusive btrfs) e retornado pela getdents(2)chamada do sistema usada para recuperar a lista de entradas em um diretório, entãolstat ainda não é necessário).

Stéphane Chazelas
fonte
+1, ótima resposta :) Observando o código-fonte ls, notei que o número do link foi atualizado após uma chamada para stat. Portanto, o comando stat fornecerá o valor dos links para um arquivo ou diretório.
Damien
O que significa ter em -vez de qualquer número no local após as permissões na ls -lsaída?
Shubham