Listar todos os arquivos com vários hardlinks e caminho relacionado

3

Como posso listar todos os arquivos com hardlinks e os caminhos associados?

Deve ser uma lista classificada, pelo ID do inode.

EDITAR: claro, quero dizer todos os arquivos com um número de link duro > = 2

Eu pensei em uma lista como

INODE_ID   FILEPATH

1234 /tmp/test1
1234 /tmp/test2
3245 /tmp/test4
3245 /tmp/test3
    
por 2IRN 30.04.2017 / 22:47

2 respostas

1

OK, nesse caso, talvez

for i in /tmp/**; do 
  [[ -f "$i" ]] && 
  (( $(stat -c %h "$i") > 1 )) && 
  stat -c '%i %n' "$i"
done | sort -V

Notas

  • for i in * para cada arquivo no diretório atual
  • [[ -f "$i" ]] && se for um arquivo normal e
  • (( $(stat -c %h "$i") > 1 )) se tiver mais de um link físico
  • stat -c '%i %n' imprime seu número e nome de inode
  • | sort -V e classifica essa saída "naturalmente"

Você pode substituir * pelo caminho dos arquivos, por exemplo, /tmp/* , o que fará com que o caminho completo seja impresso. Se você quiser pesquisar recursivamente, use shopt -s globstar e, em seguida, ** no caminho, por exemplo /tmp/**

find tem um teste de -links , mas parece ter apenas um inteiro você terá que ler Resposta da Ravexina para uma solução que a utilize.

    
por Zanna 01.05.2017 / 10:03
4

Aqui está minha solução com find :

find . -links +1 -type f -name '*' -printf '%i %p\n' | sort
  • . : pesquise no diretório atual, você pode alterá-lo para qualquer outra coisa, por exemplo: / , ~/ravexina , etc.
  • -links +1 : apenas arquivos com mais de um link (> = 2).
  • -type f : apenas arquivos (não diretórios, links sym, arquivos pipe, etc).
  • -name '*' : todos os arquivos com qualquer coisa em seus nomes, não importa o que aconteça.
  • -printf '%i %p\n' : apenas imprima inode , file path e uma nova linha \n .
  • sort : classificar linhas com base em inodes.
por Ravexina 01.05.2017 / 11:16