cp sobrescrevendo sem sobrescrever hardlinks ao destino

3

Digamos que eu tenha a seguinte configuração:

$ cat fileA
textA
$ cat fileB
textB
$ ln fileA myLink
$ cat myLink # as expected
textA

Eu não entendo o seguinte comportamento:

$ cp fileB fileA
$ cat myLink # expected ?
textB

Eu teria esperado esse resultado se tivesse escrito ln -s fileA myLink , mas não aqui.

Eu teria esperado que cp no modo de substituição fizesse o seguinte:

  1. Copie o conteúdo de fileB em algum lugar no disco rígido
  2. Link fileA para esse endereço do disco rígido

mas, em vez disso, deduzo que faz o seguinte:

  1. Siga o link fileA
  2. Copie o conteúdo de fileB nesse endereço

O mesmo não parece ir para mv , com o que funciona como eu esperava.

Minhas perguntas:

  1. Isso é explicado em algum lugar que perdi em man cp ou man mv ou man ln ?
  2. Esse comportamento é apenas uma coincidência, (digamos se fileB não é muito maior em tamanho que fileA ) , ou pode ser usado com segurança como um recurso?
  3. Isso não elimina a ideia de hard links?
  4. Existe alguma maneira de modificar a linha cp fileB fileA para que o próximo cat myLink ainda mostre textA ?
por marsupilam 14.08.2016 / 11:31

2 respostas

4

Não há "seguindo o link" com hardlinks - criar um hardlink simplesmente dá vários nomes diferentes para o mesmo arquivo (em baixo nível, arquivos são na verdade números inteiros - "inodes", e eles têm nomes apenas para conveniência do usuário) - não há "original" e "cópia" - eles são os mesmos. Então, é completamente o mesmo que dos hardlinks que você abre e escreve, eles são todos iguais.

Portanto, cp por padrão abre um arquivo e grava nele, alterando assim o arquivo (e, portanto, todos os nomes que ele possui). Então sim, é esperado. Agora, se você (em vez de reescrever) primeiro remover um dos nomes (reduzindo assim a contagem de links) e, em seguida, recriar o novo arquivo com o mesmo nome que você, você acabaria com dois arquivos diferentes. Isso é o que o cp --remove-destination faria.

Noções básicas de

1 estão documentadas em link(2) apontado por ln(1)

2 sim, é um comportamento normal e não um acaso. Mas veja acima observação sobre cp --remove-destination

3 não, na verdade não. Hardlinks são simplesmente vários nomes para o mesmo arquivo. O que você parece querer são links COW (copy-on-write), que só existem em sistemas de arquivos especiais

4 sim, cp --remove-destination fileB fileA

    
por 14.08.2016 / 12:14
0

Sim, isso é um comportamento esperado. ln fileA myLink cria um hard link , isto é, fileA e myLink são dois nomes para o mesmo arquivo de disco.

Use ls -il para exibir os números inode , e você verá que você tem apenas dois arquivos distintos criados no final do seu exemplo.

Além das páginas man mencionadas, você também pode querer ler man 2 link para mais detalhes sobre a chamada do sistema subjacente.

I infer that cp not only overwrites the link of fileA to a link to a newly created copy of fileB, but actually follows the link of fileA and writes a copy of fileB there ?

Você está interpretando mal o que é um link . cp não 'segue o link do arquivo A' mais do que segue o link do myLink. Ambas as entradas de diretório estão ligadas ao mesmo inode. Considere que, quando você rm um arquivo, a chamada do sistema subjacente é denominada unlink .

    
por 14.08.2016 / 12:00

Tags