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 dizer?
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 dizer?
Respostas:
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.
.bashrc
é um arquivo que contém ..." quando queremos dizer "o caminho relativo .bashrc
se 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 :-)
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
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 a criação do segundo link físico, basta comparar os mtime
s dos diretórios.
Caso especial: se um dos diretórios tiver um mtime
antes do arquivo (inode) mtime
e 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.
ls -lU
truque não funcionará em sistemas de arquivos modernos (ext4, btrfs, zfs), pois as entradas não aparecem na ordem da criação.
rm myold_file
, em seguida, mylink
ainda 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
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.
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".
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.
ls > a; ln a b; rm a; ln b c
, qual é "mais original" que o outro?a
se foi, você é deixado comb
ec
...