Como posso encontrar todos os arquivos com hardlink em um sistema de arquivos?

18

Eu preciso encontrar todos os arquivos com link físico em um determinado sistema de arquivos. Por exemplo. obter uma lista de arquivos, cada linha contém pares vinculados ou trios, etc.

Eu entendo mais ou menos como fazer isso, é preciso criar um dicionário codificado por inode para todos os arquivos / diretórios em um sistema de arquivos, excluir "." e ".." links e, em seguida, os indodes com mais de um nome são hardlinks ... Mas espero que talvez exista uma solução pronta ou alguém já tenha escrito esse script.

    
por haimg 10.10.2012 / 17:35

3 respostas

14

Você pode executar o seguinte comando:

find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'

para encontrar todos os arquivos com link físico.

Ou versão @mbafford:

find / -type f -links +1 -printf '%i %n %p\n'
    
por 10.10.2012 / 17:46
15
find . -type f -links +1 2>/dev/null

fornece uma lista de todos os arquivos que possuem mais de um link, ou seja, arquivos para os quais existe um link físico. Fazer um loop sobre isso é relativamente fácil - uma solução hacky, se você não tiver muitos arquivos,

for i in $(find . -type f -links +1 2>/dev/null); do find -samefile $i | awk '{printf "%s ", $1}'; printf "\n"; done | sort | uniq

Mas espero sinceramente que haja soluções melhores, por exemplo, permitindo que o primeiro find chame números de inode de impressão e, em seguida, usando a opção find -inum para mostrar todos os arquivos associados a este inode.

    
por 10.10.2012 / 17:49
0

IMHO, a melhor maneira é usar a seguinte linha (com certeza você tem que substituir /PATH/FOR/SEARCH/ com o que você quer pesquisar):

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n

isso varre o sistema de arquivos apenas uma vez, mostra inode, número de hardlinks e caminho de arquivos com mais de um hardlink e os classifica de acordo com o inode.

Se você estiver incomodado com mensagens de erro para pastas que não tem permissão para ler, você pode expandir a linha para isso:

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' 2> /dev/null | fgrep -f <(find . -xdev -printf '%i\n' 2> /dev/null | sort -n | uniq -d) | sort -n
    
por 01.10.2018 / 21:43