Você não pode, porque eles são literalmente o mesmo arquivo, só alcançados por caminhos diferentes. O primeiro não tem status especial.
Por exemplo, eu tenho um arquivo myold_file
. Então eu uso ln
para criar um link físico como mylink
:
ln myold_file mylink
Então, mesmo usando ls -a
, não sei dizer qual é o antigo.
Existe alguma maneira de contar?
Não existe uma maneira direta, limpa (confiável) de fazer isso. Mas, sob circunstâncias apropriadas, isso pode ser possível (ou pelo menos provável). O problema é que existem dois links físicos, mas apenas um arquivo. Mudança, modificação e (talvez) tempo de criação são armazenados apenas para arquivos (inodes), mas não para entradas de diretório (os hard links). Assim, a informação que você quer pode ser obtida de efeitos secundários, que podem ser facilmente destruídos por operações que não estão relacionadas ao arquivo. E você não pode nem ver se foi destruído. Você só pode saber que, a partir das circunstâncias operacionais, você está ciente delas.
A criação de um link físico é uma operação de gravação para o diretório que contém o link. Assim, atualiza o diretório mtime
. Então, se
os links estão em diretórios diferentes
e você sabe que nenhum desses diretórios foi alterado (arquivo adicionado, excluído, renomeado ou alteração de metadados do arquivo) após o segundo link físico ter sido criado, então você pode simplesmente comparar o mtime
s dos diretórios .
Caso especial: Se um dos diretórios tiver um mtime
antes do arquivo (inode's) mtime
e você puder ter certeza de que o arquivo não foi gravado depois de um breve momento após sua criação, o link deste diretório é o mais antigo.
Se os links estão no mesmo diretório (o que parece ser o caso em sua pergunta), então fica pior. Então você pode usar
ls -lU
para obter uma impressão da ordem em que as entradas foram criadas. Isso não precisa ser a ordem correta, pois as entradas podem ser excluídas para que novas entradas sejam feitas no meio da lista de diretórios. E como Gilles apontou, não funciona com sistemas de arquivos mais novos.
Se você confiar na hora da última modificação dos diretórios e não tiver conhecimento de como e quando esses diretórios forem alterados, depender do mtime fará com que você fique errado em alguma porcentagem do tempo. O problema aqui é que o arquivo é representado no sistema de arquivos por um inode, não por uma entrada de diretório. A entrada de diretório (filename) aponta para o inode, não para o arquivo.
Eu acho que eu estaria fazendo um pouco de umbigo olhando por que eu preciso saber qual entrada de diretório é mais antiga e como evitar a necessidade de saber isso.
Eu acho que esta pergunta é (bastante razoável) equivocada quanto ao que realmente é um link difícil. No entanto, acho que a resposta direta mais correta é 'Ambos são' .
Os sistemas de arquivos Unix normalmente armazenam o conteúdo e os dados reais dos arquivos em i-nodes, eles não têm um caminho, os caminhos têm uma relação de muitos para um com esses i-nodes. Tome como analogia uma pessoa que usa dois nomes, Bob e Joe. Não se pode dizer que Bob é mais velho que Joe ou vice-versa, são apenas nomes para a mesma pessoa.
Se você quiser manter o conceito de um arquivo 'original' e um novo, provavelmente você está procurando por um link simbólico; eles são mais de um alias, apenas uma instrução para o sistema operacional que deve operações para um caminho. como se fossem para outro sem alterar a estrutura do arquivo por baixo. (você pode fazer isso com "ln -s link do arquivo".
Se você tiver alguma dúvida, por favor, apenas comente aqui. Espero que isso ajude.
O ponto crucial da resposta dada por vários outros acima é que o nome de cada arquivo é um link rígido para um arquivo. Não há nenhum original real, apenas possivelmente um primeiro.
Pense em um diretório como uma tabela que lista nomes de arquivos e números de inode.
Todo link físico, incluindo o primeiro, é uma entrada em um diretório que atribui um "nome de arquivo" ao número do inode, para que você possa acessar o arquivo com esse nome.
O arquivo é uma coleção de blocos em disco, gerenciados e rastreados por metadados armazenados em um inode. Um arquivo tem um número de inode.
Acessar os dados de um arquivo através do nome do arquivo é um processo de três etapas: O nome do arquivo é pesquisado no diretório para obter o número do inode. O inode é então referido para encontrar o bloco de disco relevante (ou blocos) contendo os dados. Então, finalmente, esses blocos são lidos / escritos.
Portanto, o que você leva para casa é basicamente o seguinte: Não há absolutamente nenhuma diferença entre acessar o conteúdo do arquivo usando o primeiro ("original") ou qualquer link físico criado posteriormente.
Tags hard-link filesystems