![Qual é o número entre a permissão do arquivo e o proprietário na saída do comando ls -l?](https://rvso.com/image/23927/Qual%20%C3%A9%20o%20n%C3%BAmero%20entre%20a%20permiss%C3%A3o%20do%20arquivo%20e%20o%20propriet%C3%A1rio%20na%20sa%C3%ADda%20do%20comando%20ls%20-l%3F%20.png)
A saída do ls -l
comando produz o seguinte resultado:
Qual é o campo numérico entre a permissão do arquivo e o proprietário? ou seja, o que são aqueles1, 1, 1 e 2? Eu verifiquei, --help
mas isso não explica.
[EDITAR] Achei que fosse o número de arquivos em um diretório, mas não é. Veja a imagem. "tempFolder" tem 3 arquivos, mas ainda mostra um "2"
Responder1
Nota: editado após comentário de @StephaneChazelas
O primeiro número da ls -l
saída após o bloco de permissão éo número de links físicos.
É o mesmo valor retornado pelo stat
comando em "Links".
Este número é a contagem de hardlinks do arquivo, quando se refere a um arquivo, ou o número de entradas de diretório contidas, quando se refere a um diretório.
Aarquivonormalmente tem uma contagem de links físicos de 1, mas isso muda se links físicos forem criados com o ln
comando. Vero manual de referência do Debian.
No seu exemplo, adicionar um link físico para tempFile2 aumentará sua contagem de links:
ln -l
ln tempFile2 tempHardLink
ln -l
Ambosarquivo temporário2etempHardLinkterá uma contagem de links 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á.
Adiretórioterá uma contagem mínima de 2 para '.'
(link para si mesmo) e para a entrada no diretório pai.
No seu exemplo, se você quiser aumentar a contagem de links depasta temporária, crie um novo diretório e o número aumentará.
ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
O link deoutra pasta/parapasta temporária/(que é ..
) será adicionado à contagem.
Responder2
No Unix, normalmente, um arquivo é alguma entrada em uma tabela de arquivos. Existem diferentes tipos de arquivos: arquivos normais, dispositivos, links simbólicos, portas, pipes, soquetes, diretórios...
O número do inode (que você pode ver na saída de ls -i
) é o índice dessa tabela.
Agora, você não acessa arquivos porinodemas porcaminho. Acaminhoé uma cadeia dediretórioentradas. Você notará que não estamos falando depastamas dediretórioaqui. Porque é isso que é uma lista telefônica (pense em uma lista telefônica).
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 chamadoslinks, também conhecido comolinks físicosdistinguir delinks virtuais(uma gíria paraligação simbólica,que é um tipo especial de arquivo que é um ponteiro para um caminho).
Um arquivo (inode) registra o número de links (de entradas em qualquer diretório) que possui, de modo que quando o número chegar a 0 (quando estiver sendo desvinculado do último diretório em que foi referenciado), ele será desalocado.
Esse é o número (o número de links) exibido na ls -l
saída.
Quando um arquivo que não é de diretório é criado pela primeira vez (com as chamadas de sistema open
ou creat
(ou bind
ou mknod
para alguns tipos de arquivos), isso é feito fornecendo um caminho para o novo arquivo (como "/a/b"
). O que acontece então é que um novo arquivo e inode são alocados e uma nova entrada é adicionada ao diretório associado ao "a"
nome no "/"
diretório raiz. Essa é a iniciallinkentão a contagem de links é uma.
Mais links podem ser adicionados posteriormente com a link()
chamada do sistema (o ln
comando). E os links podem ser removidos com a unlink()
chamada do sistema (o rm
comando).
Você notará que os arquivos do tipodiretóriogeralmente têm um número de links maior ou igual a 2.
Agora, ao criar um diretório, você está chamando a mkdir()
chamada do sistema. Algo como mkdir("/a/b")
. O que ele faz então é alocar um novo arquivo do tipo diretório. Nesse novo diretório, ele cria automaticamente duas entradas:
"."
(pontoparadiretório). Que é um link para si mesmo. Portanto, a contagem de links agora é 1.".."
(paradiretóriodediretório). Qual é um link para"/a"
. Portanto, a contagem de links"/a"
é incrementada em um
Então esse novo diretório é vinculado "/a"
(uma entrada é adicionada "/a"
para ele), então sua contagem de links agora é 2. Se um "/a/b/c"
diretório for criado, por causa da ".."
entrada em "/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 podem causar loops problemáticos. Quando eles permitem um link()
em um diretório, geralmente apenas o superusuário pode fazer isso.
Alguns sistemas de arquivos btrfs
partem dessa estrutura de diretórios tradicional. Você notará que as contagens de links em diretórios em btrfs
sistemas de arquivos são sempre iguais, mesmo que esses diretórios contenham uma "."
entrada com o mesmo número de inode que eles contêm.
O fato de a contagem de links ser tradicionalmente 2 mais o número de subdiretórios tem sua utilidade. Por exemplo, em:
find . -name '*.c' -print
if .
não contém subdiretórios, mas contém milhões de arquivos. Ao verificar a contagem de links de .
, find
podemos saber que não há subdiretório. Então tudo find
que você precisa fazer é ler o conteúdo do diretório e relatar as entradas que terminam em .c
(como um grep '\.c$'
arquivo de alguns megabytes, não é grande coisa). Caso contrário, find
seria necessário verificar o tipo de cada arquivo para ver se há diretórios para descer nele (resultando em tantas lstat()
chamadas de sistema). É claro que 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 (incluindo btrfs
) e retornado pela getdents(2)
chamada do sistema usada para recuperar a lista de entradas em um diretório, então lstat
ainda não é necessário).