É verdade que 99% das vezes que precisamos saber alguma coisa sobre um arquivo no Linux basta dar um ls. A saída do comando vai nos mostrar informações suficientes para fazer um bocado de coisa:

Alguns você vai saber dizer o que são logo de cara:

Permissões do arquivo: (-rw-r–r–.)
Dono e grupo do arquivo: (root root)
Tamanho do arquivo: (938)
Data da última alteração: (Sep 25 2014)
Nome do arquivo: (/etc/passwd)

Mas que raios é aquele 1 lá no segundo campo? E a data? Tem certeza que significa o que você acha que significa?

Vamos tentar uma coisa:

Pera! Acabei de alterar o arquivo… A data continua a mesma. E ai?

Tudo bem que o ls tem diversas opções que quando usadas em conjunto vão mostrar tudo sobre o arquivo, mas um comando mais simples para entendermos o que estamos vendo é o stat:

Ahá! Isso é interessante. O comando stat vai ter mostrar metadata a respeito do arquivo. Nome do arquivo, tamanho, blocos, dispositivo, inode, links, permissões e datas.

A primeira informação que interessa aqui é “Links”, que também é 1, assim como aquele desconhecido no comando ls. Se você já ouviu as expressões soft-links e hard-links esse número é a quantidade de hard-links nesse arquivo. Mais sobre isso em alguns instantes.

A próxima coisa a se notar é a Change date. Essa coincide com a modificação que executei agora a pouco no arquivo. Mas porque não alterou a Modify date? Simples: A Modify date é atualizada quando você altera o arquivo, enquanto a Change date é atualizada quando você altera informações a respeito – ou metadata – do arquivo!

Mas vamos falar um pouco mais de hard-links…

No Linux um mesmo arquivo pode existir em diversos lugares no sistema de arquivos. Não é uma cópia, não é um link. É realmente o mesmo arquivo. Isso é possível através de um hard-link, onde um ou mais ponteiros vão estar indicando o mesmo arquivo físico em disco.

Olha isso:

Percebam que o segundo campo do comando ls mudou de 1 para 2, que já sabemos se tratar do número de hard-links. Mas vamos ver com o stat:

Observem que “Device” e “Inode” para ambos os arquivos são os mesmos!  É o mesmo arquivo. Isso é bem diferente de um soft-link (ou symlink):

O novo arquivo é claramente um link, como fica fácil de identificar tanto pelo ls como pelo stat.

Agora, o que acontece se eu remover o arquivo original?

O arquivo vovo_mafalda.txt continua lá, mas o número de hard-links abaixou de 2 para 1. Já o papai_papudo.txt ainda aponta para um arquivo que não existe mais e quando tentamos acessá-lo recebemos um erro.

Basicamente um arquivo vai continuar existindo no sistema enquanto o número de (hard) links for igual ou maior que 1. Uma vez removidos todos os links, o sistema de arquivos efetivamente apaga o mesmo.

Como você encontra todos os hard-links para um mesmo arquivo no seu sistema? Com o find:

  • Notem que eu adicionei a opção xdev, que impede que o find procure em outros filesystems, já que hard-links só podem ser criados no mesmo filesystem que o arquivo original!

Que bom que você perguntou!

Quer dizer que tem 61 cópias do /etc no meu sistema de arquivo?

Não, pelo jeito não.

No caso de diretórios não é possível criar hard-links para eles:

A informação com o número de hard-links na verdade aponta para o número de sub-diretórios contidos naquele diretório. Olha ai:

A diferença de 1 (61 vs 60) é porque o comando find não lista o “..” mas ele vai na conta de hard-links.

Então tá ai.