Script Remove Todos os hardlinks para um arquivo específico

4

Eu quero excluir todos os hardlinks de um arquivo específico.

O uso seria script somefile , isso contaria os hardlinks para o arquivo somefile, então ele excluiria todos os hardlinks mantendo apenas este arquivo.

O comando

find / -samefile file-name | xargs rm

fará o necessário, mas isso também exclui o arquivo original.

Além disso, você pode usar

find / -inum Inode-number | xargs rm

Mas isso também excluiria o arquivo original.

Meu primeiro script veriosn parece

#!/bin/bash
file=
inode='ls -li $file | cut -d" " -f1'

find / -inum $inode | xargs rm

Mas, como eu disse acima, isso também excluiria o arquivo original, portanto, como manter a primeira instância e remover outras.

    
por Maythux 01.06.2015 / 17:09

2 respostas

5

Você pode usar ! com o caminho para o arquivo original para excluí-lo:

$ find . -samefile bar                   
./baz
./bar
$ find . -samefile bar ! -path "./bar"   
./baz

O caminho deve corresponder a find das saídas, portanto, use caminhos absolutos se você pesquisar em / .

Notas:

  • find tem um comando -delete
  • Se combinar com xargs , use -print0 e -0 :

    find  . -samefile bar ! -path "./bar" -print0 | xargs -0 rm
    
  • Use stat para obter o número do inode diretamente:

    $ stat -c '%i' bar
    257643
    
por muru 01.06.2015 / 17:36
0

Isso funciona para nomes absolutos e relativos, além de não imprimir nenhuma caixa de diálogo "Permissão negada" e imprime Deletion failed: <filename> quando a exclusão falha:

find / -samefile "" \! -path "${PWD}/" \! -delete -printf 'Deletion failed: %p\n' 2>/dev/null
    
por MichalH 01.06.2015 / 18:11