Rm hardlink sem remover o próprio arquivo / diretório

0

Digamos que eu crie um link físico com ln x y .

Existe uma maneira de remover o link em y sem remover o arquivo em x, depois que eu criei o link? Parece que eu fiz um rm -rf on y e deletei x também, gostaria de evitar que, se possível, lol.

    
por Alexander Mills 10.09.2017 / 09:25

2 respostas

5

$ echo 'hello' >name

$ ln name othername

$ ls -l
total 4
-rw-r--r--  2 kk  wheel  6 Jun 25 09:45 name
-rw-r--r--  2 kk  wheel  6 Jun 25 09:45 othername

$ cat othername
hello

$ rm name

$ ls -l
total 2
-rw-r--r--  1 kk  wheel  6 Jun 25 09:45 othername

$ cat othername
hello

Você está fazendo algo muito errado se, removendo um link físico, também remover o outro. Usar rm ou rm -rf neste caso não importa, nem importa qual nome é removido.

A remoção de um link físico apenas remove um dos nomes do arquivo. A única maneira de ver que rm -rf poderia remover os dois nomes é se você usou um nome de arquivo glob que correspondesse a ambos os nomes ou se você excluísse o diretório que continha os dois.

Aparentemente, a partir de comentários, você está realmente usando um aplicativo que cria um link físico para um diretório . Isso é possível em sistemas de arquivos macOS HFS + sob certas condições. Em geral, é muito complicado trabalhar com diretórios vinculados, e seu uso é amplamente limitado a coisas como o próprio software TimeMachine da Apple.

Pergunta Stackoverflow relacionada: O que é o comando Unix para criar um hardlink para um diretório no OS X?

Aponta-se entre as respostas a essa pergunta, que um diretório vinculado rígido precisa ser excluído usando unlink em vez de rm -r , pois rm -r excluiria os conteúdos do diretório ( sob todos os seus nomes).

Veja também: Forçosamente crie link (s) rígido (s) por diretório?

    
por 10.09.2017 / 09:31
1

Links são novos nomes de arquivos apontando para o mesmo arquivo. Criar um link físico é criar uma nova entrada de diretório (nome do arquivo) apontando para o inode do arquivo original. Essa é a razão pela qual você não pode estabelecer hard link entre os sistemas de arquivos e porque os metadados (permissões, xattrs, etc) são os mesmos para ambos os links. No Linux, criar hard links é apenas um arquivo possível, não um diretório.

O número de entradas de diretório é rastreado pela contagem de links no inode. Quando um link físico é criado, a contagem de links é incrementada. Ao excluir um arquivo, a entrada de diretório é removida e a contagem de links é diminuída. Você pode verificar a contagem de links na coluna ls -l output 2nd. A exclusão de uma única entrada de diretório (link) não remove as outras.

Se você criou um novo link físico no mesmo diretório que contém o arquivo de destino, algo como rm -rf * obviamente excluiria ambos os links (e o espaço usado pelo arquivo seria recuperado pelo sistema de arquivos se a contagem de links fosse 0).

    
por 10.09.2017 / 09:45