Quebrando um link físico no local?

9

Estou mantendo meus dotfiles sob controle de versão e o script que os implanta cria links físicos. Eu também uso etckeeper para colocar meu /etc sob controle de versão. 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 link físico.

Então, minha pergunta é: existe uma maneira de quebrar um link para um arquivo sem realmente precisar saber onde estão os outros hard-link / s para esse arquivo?

    
por 0xC0000022L 04.03.2013 / 13:46

6 respostas

10
cp -p filename filename.tmp
mv -f filename.tmp filename

Tornando-o scriptável:

dir=$(dirname -- "$filename")
tmp=$(TMPDIR=$dir mktemp)
cp -p -- "$filename" "$tmp"
mv -f -- "$tmp" "$filename"

Fazer a cópia primeiro e, em seguida, colocá-la no lugar, tem a vantagem de o arquivo mudar atomicamente de ser um link físico para uma cópia separada (não há ponto no tempo em que filename seja parcial ou ausente). / p>     

por 06.03.2013 / 01:40
7

Você provavelmente quer dizer que deseja dividir o link físico em um arquivo separado e independente.

mv hardlink tempname && cp tempname hardlink && rm tempname

Um hardlink é a conexão entre uma entrada no diretório e o bloco inode no disco.

inodes armazenam metadados do arquivo e, para arquivos pequenos, alguns sistemas de arquivos armazenam dados no inode, senão ponteiros para os blocos de dados e para arquivos muito grandes listas indiretas e duplamente indiretas de ponteiros para unidades de alocação de disco. / p>

Independentemente disso, a conexão entre o nome do arquivo (que é o que o comando ls produz) e o bloco de inode que armazena esses meta-dados, é chamado de hard link.

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. Uma vez que um inode não é mais referenciado por nenhum arquivo, seu espaço é liberado para uso por outros arquivos.

    
por 04.03.2013 / 14:00
3

Coloque isso no final do seu arquivo ~ / .bashrc.

delink () { tmpfile="$1$(date)"; cp -a "$1" "$tmpfile"; mv "$tmpfile" "$1"; }

Execute como este

delink filename
    
por 25.04.2014 / 13:15
2

A melhor maneira de fazer isso com um script bash seria algo assim:

if [ -f "$1" ] ; then
dir="$(dirname -- "$1")"
tmpfile="$(mktemp --tmpdir="$dir")"
cp --preserve=all -f -- "$1" "$tmpfile"
mv -f -- "$tmpfile" "$1"
fi

aponta para observação:

  • verifique se o arquivo é um arquivo normal antes de tentar copiá-lo
  • mantenha o arquivo antigo no lugar até que a cópia esteja pronta
  • use mktemp para gerar um arquivo com garantia de não existir
  • use -f para forçar a sobregravação e --preserve=all para manter os metadados o mais semelhantes possível ao arquivo original
  • use -- e " para citar caminhos contendo espaços e / ou começando com -

Realizar a substituição sem criar um arquivo temporário não é possível com as chamadas do sistema linux atuais (3.16): embora seja possível sobrescrever um arquivo atomicamente (ou seja, remover o arquivo antigo e substituir por um novo como uma única operação ), 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 flag da função open ) porque a função rename requer um nome de arquivo como entrada não é uma versão de rename que recebe como entrada um descritor de arquivo - consulte aqui para detalhes)

    
por 06.08.2014 / 13:57
0

O comando que você está procurando é unlink

    
por 04.03.2013 / 13:51
0

Se você está procurando por todos os nomes de arquivos que são hardlink para este arquivo, então você pode usar:

find -samefile myknowhardlinkfile

também ls -il myknowhardlinkfile mostrará o número do nome do arquivo vinculado ao mesmo inode (terceiro campo).

101612442 -rw-rw-r--. 2 me me 0 Aug  5 07:07 myknowhardlinkfile
    
por 06.08.2014 / 14:21

Tags