Como saber qual arquivo é original se o link físico for criado

32

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?

    
por BufBills 31.03.2014 / 06:24

5 respostas

90

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 31.03.2014 / 06:55
16

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

  1. os links estão em diretórios diferentes

  2. 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.

    
por 31.03.2014 / 06:41
10

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.

    
por 31.03.2014 / 07:10
8

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.

    
por 01.04.2014 / 12:57
2

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.

    
por 02.04.2014 / 09:40