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


34

Por exemplo, eu tenho um arquivo myold_file. Então eu uso lnpara 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 dizer?


2
Contra-pergunta: Em caso afirmativo ls > a; ln a b; rm a; ln b c, qual é "mais original" que o outro? ase foi, você é deixado com be c...
glglgl

2
O que você está tentando alcançar? O que você está tentando alcançar? Não existe "original" como tal. Um arquivo é um inode contendo metadados e uma coleção de blocos contendo dados. Um diretório pode conter um link para o arquivo, e esse link é o nome do arquivo e o número do inode. Você pode criar qualquer número de links para um arquivo. Os arquivos podem nunca ter menos de um link.
Johan

Para uma explicação detalhada da resposta aceita desta pergunta: Consulte a resposta aceita dessa pergunta .
Ut

Respostas:


93

Você não pode, porque eles são literalmente o mesmo arquivo, somente alcançados por caminhos diferentes. O primeiro não tem status especial.


4
Essa é claramente a resposta certa: a pergunta do OP é baseada em um mal-entendido.
precisa

8
@ Adnan Na verdade, não: os dois links físicos são o mesmo arquivo. São entradas de diretório diferentes. A terminologia de Jenny D está correta.
Gilles 'SO- stop be evil'

11
@ Gilles Não vejo como isso pode estar correto. Dois links físicos não são dois arquivos ; links físicos não são arquivos. Eles apontam , portanto, vinculam , para o mesmo arquivo (que é o local físico no disco). Dizer que "dois links físicos são literalmente o mesmo arquivo" está errado.
Adi

11
@ JennyD E essa é basicamente a única maneira de ouvir o "hard link" sendo usado; um ponteiro do sistema de arquivos para um inode. Bem, acho que estamos todos errados e certos. Vou parar de discutir isso, pois é inútil. Sua resposta parece correta para mim, você tem um +1 de mim e eu deixarei assim.
Adi

5
Dizer que um link físico "é" um arquivo está comparando itens de diferentes categorias, o que é tecnicamente incorreto. Mas, como geralmente dizemos " .bashrcé um arquivo que contém ..." quando queremos dizer "o caminho relativo .bashrcse refere a um arquivo que contém ...", essa é uma combinação comum de categorias e devemos entender que sempre que alguém se refere a um caminho ou uma entrada de diretório "sendo" um arquivo, queremos dizer o arquivo ao qual ele se refere. Com esse entendimento, dois links físicos podem "ser" o mesmo arquivo. Rejeitando essa convenção em favor da linguagem formal, eles não podem. Ambas as posições têm o seu lugar :-)
Steve Jessop

16

Não há maneira direta, limpa (confiável) de fazer isso. Mas, em 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. O tempo de alteração, modificação e (talvez) criação são armazenados apenas para arquivos (inodes), mas não para entradas de diretório (os links físicos). Assim, as informações desejadas podem ser obtidas apenas de efeitos secundários, que podem ser facilmente destruídos por operações que não estão relacionadas ao arquivo. E você nem consegue ver se foi destruído. Você só pode saber disso pelas circunstâncias operacionais se estiver precisamente ciente delas.

A criação de um link físico é uma operação de gravação no diretório que contém o link. Assim, ele 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 a criação do segundo link físico, basta comparar os mtimes dos diretórios.

Caso especial: se um dos diretórios tiver um mtimeantes do arquivo (inode) mtimee você tiver certeza razoável de que o arquivo não foi gravado depois de um breve momento após sua criação, o link desse diretório será o mais antigo.

Se os links estiverem no mesmo diretório (o que parece ser o caso na sua pergunta), as coisas pioram. Então você pode usar

ls -lU

para obter uma impressão da ordem em que as entradas foram criadas. Essa 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, isso não funciona de maneira alguma com sistemas de arquivos mais novos.


2
Nenhuma menção a selinux, trilhas de auditoria ou espionagem no diário do sistema de arquivos ??? smirk Sem uma trilha de auditoria, não há como saber - qualquer outra coisa é um palpite
Ricky Beam

11
@ mikeserv Se você quiser ensinar aos outros dessa maneira, deve aprender pelo menos a citar corretamente. Ele não dizer "qual arquivo" na questão. E mesmo que isso acontecesse, isso seria apenas um problema de redação e lançar algum cérebro para entender a pergunta revelaria facilmente o que realmente é.
Hauke ​​Laging 31/03/14

4
O truque mtime do diretório funcionará se as circunstâncias forem corretas (o que é raro). No entanto, da maneira que você a apresenta, às vezes você chega à conclusão oposta. O diretório mtime é apenas uma indicação válida se for igual ao ctime do arquivo. Mas o ls -lUtruque não funcionará em sistemas de arquivos modernos (ext4, btrfs, zfs), pois as entradas não aparecem na ordem da criação.
Gilles 'SO- stop be evil'

2
@mikeserv - a pergunta do OP é baseada em um mal-entendido. Se o fizessem rm myold_file, em seguida, mylinkainda existiria e funciona perfeitamente, como é igualmente uma boa entrada referindo-se ao mesmo inode subjacente. Somente quando ambos foram excluídos, o sistema pode descartar o inode. Uma vez que a ligação física foi usada para criar duas entradas do sistema de arquivos referentes ao mesmo arquivo, elas são equivalentes. (Observe que "arquivo" aqui significa "um inode que mantém os dados de um arquivo, em oposição a um diretório). Veja: en.wikipedia.org/wiki/Inode
Daniel Earwicker

11
-1 porque, embora as informações sobre como o diretório seja alterado em alguns sistemas de arquivos ao atualizar as tabelas, esta resposta não esclareça o entendimento incorreto presente na pergunta que "arquivo original" não é uma propriedade no caso de vários hardlinks para um único inode. Nesse sentido, enquanto é interessante, não é o que a maioria das pessoas que aborda essa questão deve aprender sobre o conceito fundamental de links físicos. Esse problema não é a falta de uma "maneira direta e limpa de fazê-lo"; o problema é que não existe "ele" em primeiro lugar.
Caleb

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, contar com o mtime levará você a estar 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 do diretório (nome do arquivo) aponta para o inode, não para o arquivo.

Eu acho que estaria fazendo umbigo olhando por que eu preciso saber qual entrada de diretório é mais antiga e como evitar precisar disso.


8

Penso que esta questão é (razoavelmente) equivocada quanto ao que realmente é um link físico. Penso, no entanto, 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 nos nós-i; eles não possuem um caminho, os caminhos têm um relacionamento de muitos para um-nós. Tome como analogia uma pessoa que usa dois nomes, Bob e Joe. Não se poderia dizer que Bob é mais velho que Joe ou vice-versa, são apenas nomes para a mesma pessoa.

Se você deseja manter o conceito de um arquivo 'original' e um novo, provavelmente está procurando um link simbólico, esse é mais um alias, apenas uma instrução para o sistema operacional de que ele deve operar em um caminho como se foram para outro sem alterar a estrutura do arquivo abaixo. (você pode fazer isso com "ln -s link do arquivo".


Você sabe, Bob / Joe pode ser muito sensível com a idade dele ... A comparação de links físicos / físicos é boa - especialmente quando você considera que um link físico apenas adiciona uma entrada a um arquivo de diretório - uma já existente inode - mas um link flexível é um arquivo por si só e, portanto, recebe seu próprio inode. Ainda assim, em ambos os casos, o tempo de modificação é relevante apenas para o arquivo vinculado, pois as únicas modificações que podem ser feitas em um link de qualquer significado seriam apenas criação / exclusão.
precisa saber é o seguinte

2

O ponto crucial da resposta dada por várias outras pessoas acima é que o nome de cada arquivo é um link físico para um arquivo. Não existe um 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.

O acesso aos dados de um arquivo por meio 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 (s) bloco (s) de disco relevante (s) que contém os dados. Finalmente, esses blocos são lidos / gravados.

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 os links físicos criados posteriormente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.