Estou mantendo meus dotfiles sob controle de versão e o script que os implementa cria links físicos. Eu também uso etckeeper
para colocar meu /etc
controle de versão sob. Recentemente, recebi avisos como este:
warning: hard-linked files could cause problems with bzr
Uma cópia simples ( cp filename.ext filename.ext
) não funcionará:
cp: `filename.ext' and `filename.ext' are the same file
Renomear / mover um arquivo - exceto nos volumes - também não quebra o vínculo físico.
Então, minha pergunta é: existe uma maneira de quebrar um vínculo físico com um arquivo sem realmente precisar saber onde estão os outros vínculos físicos com esse arquivo?
Respostas:
Tornando programável:
Fazer a cópia primeiro e depois movê-la para o lugar tem a vantagem de que o arquivo muda atomicamente de um link físico para uma cópia separada (não há um ponto no tempo em que
filename
esteja parcial ou ausente).fonte
Você provavelmente quer dizer que deseja dividir o hard-link em um arquivo separado e independente.
Um hardlink é a conexão entre uma entrada no diretório e o bloco inode no disco.
inodes armazenam metadados de arquivos e, para arquivos pequenos, alguns sistemas de arquivos armazenam dados no inode, caso contrário, apontam para os blocos de dados e para arquivos muito grandes listas indiretas e indiretas e indiretas duplas de apontadores para unidades de alocação de disco.
Independentemente disso, a conexão entre o nome do arquivo (que é o que o comando ls produz) e o bloco inode que armazena esses metadados é chamada de link físico.
Ter vários links físicos para um único arquivo significa o mesmo inode referenciado por mais de uma entrada de diretório, possivelmente em diretórios diferentes (em um único sistema de arquivos)
rm exclui a entrada do nome do arquivo do diretório Depois que um inode não é mais referenciado por nenhum arquivo, seu espaço é liberado para uso por outros arquivos.
fonte
cp
emv
implicaram. Portanto, não há como usar um arquivo temporário, pelo que vejo.cp -a
(pelo menos GNU coreutils).Coloque isso no final do seu arquivo ~ / .bashrc.
Execute-o assim
fonte
A melhor maneira de fazer isso com um script bash seria algo como isto:
pontos a serem observados:
mktemp
para gerar um arquivo que é garantido que não existe-f
para forçar a substituição e--preserve=all
manter os metadados o mais semelhante possível ao arquivo original--
e"
para citar caminhos contendo espaços e / ou começando com-
Não é possível fazer a substituição sem criar um arquivo temporário com as chamadas atuais do sistema linux (3.16): embora seja possível sobrescrever um arquivo atomicamente (por exemplo, remover o arquivo antigo e substituí-lo por um novo como uma única operação), ele não é possível fazer isso com um arquivo que não tem nome no sistema de arquivos (ou seja, um arquivo temporário criado usando o
O_TMPFILE
sinalizador deopen
função) porque arename
função requer um nome de arquivo como entrada (não há uma versãorename
que aceite como entrada um descritor de arquivo - veja aqui para detalhes)fonte
dirname
emktemp
. Fixa que para você ...$( ... )
substituição do comando -style. Um dos motivos é o melhor` ... `
estilo.`
você colocar:`\``
(é claro, eu escapei duas vezes para mostrar o que você digita).O comando que você está procurando é
unlink
fonte
cp
emv
eu pretendi deixar claro que desejo que o arquivo exista depois.Se você estiver procurando por todos os nomes de arquivos com links diretos para esse arquivo, poderá usar:
também
ls -il myknowhardlinkfile
mostrará o número do nome do arquivo vinculado ao mesmo inode (terceiro campo).fonte