É 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!
Pera… E esse monte de links no meu diretório?
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.