Como encontrar todos os hardlinks em uma pasta?

2

Eu tenho dois discos externos que possuem os mesmos arquivos. Um é criptografado, o outro não é. O criptografado tem muito menos espaço do que o não criptografado, agora suponho que seja devido a hardlinks nos discos não criptografados.

Portanto, gostaria de verificar se há arquivos com link físico que possam ser duplicados no disco criptografado. Como posso identificar um link físico?

Se você tiver outras ideias sobre o motivo da questão do espaço livre, estou aberto a ideias. É possível que os arquivos precisem de mais espaço por causa da criptografia?

    
por Jeno 02.11.2017 / 14:13

4 respostas

8
$ find -type f -links +1

Isso mostrará todos os arquivos regulares que tenham mais de um link (nome) para eles. Ele não informa quais nomes estão vinculados ao mesmo arquivo, pois você pode usar -samefile ou -inum , por exemplo, find -samefile "$somefile"

No sentido técnico, todos os arquivos (nomes de arquivos) são (hard) links, é apenas que arquivos com mais de um link apontando para eles são interessantes nesse sentido. Mas mesmo nesses casos, não há como dizer que um deles é o arquivo "correto", e o outro é um link, os links são iguais.

Como exemplo:

$ touch a b c
$ ln b b2 ; ln c c2
$ find -type f -links +1
./c2
./b
./b2
./c
$ find -samefile b
./b
./b2
    
por ilkkachu 02.11.2017 / 19:42
5

Pesquisar links físicos

As respostas de @ ilkkachu e @ barrycarter são boas. Esta resposta é uma alternativa, que descreve alguns resultados com mais detalhes.

  • Se o {{match is / matches} estiver na mesma árvore de diretórios, você os encontrará diretamente.

  • Caso contrário, você pode pesquisar em todo o sistema de arquivos a partir do ponto de montagem, mas apenas dentro do mesmo sistema de arquivos usando -xdev , o que é importante se você pesquisar a partição raiz / e existem outras partições montadas.

    $ sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt
    

A seguir, um exemplo, em que um par vinculado sólido é encontrado no diretório atual e duas correspondências vinculadas são encontradas em outro diretório, pesquisando a partir do ponto de montagem /media/multimed-2 da partição de dados.

$ sudo find . -xdev -type f -links +1 -ls | sort -n
  5242881    648 -rw-rw-r--   2 olle     nio        657936 jun 30  2015 ./like-this.png
  5242882    940 -rw-rw-r--   2 olle     nio        957688 jun 30  2015 ./from-here.png
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./img_4810.jpg
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./mid-sommer-night_4810.jpg

$ find /media/multimed-2/ -samefile ./like-this.png
/media/multimed-2/Photos/2015/06/30/like-this.png
/media/multimed-2/Bilder/kartor/like-this.png

$ find /media/multimed-2/ -samefile ./from-here.png
/media/multimed-2/Photos/2015/06/30/from-here.png
/media/multimed-2/Bilder/kartor/from-here.png

Outras causas pelas quais diferentes quantidades de espaço em disco são usadas

  • Diferentes sistemas de arquivos (ext4, NTFS, FAT32 ...)

  • Tamanho de partição diferente, o que causa diferenças na sobrecarga (metadados).

  • Tamanho de setor diferente na unidade (talvez?)

por sudodus 02.11.2017 / 16:34
4

Em teoria, os hard links devem ser indistinguíveis dos arquivos regulares (isso é meio que o ponto). Se "x" é um hardlink para "y", então "y" também é um hardlink para "x". Dito isto, a segunda coluna de ls -l informa quantos links existem para um determinado arquivo. Se este número for maior que 1, o arquivo é ou tem um hardlink em algum lugar. Isso pode não funcionar para diretórios, mas não sei por quê. Eu inicialmente disse que cada arquivo em um diretório tem um link para esse diretório, mas eu estava errado: eu encontrei um diretório com 10 arquivos cuja "contagem de links" era de apenas 2.

Uma vez que você encontrou o hard link, você pode usar ls -i para ver seu inode, e então usar a opção inode de find para encontrar outro arquivo com o mesmo inode (tornando-os hard links uns aos outros). Não se esqueça de restringir find a um dispositivo específico, caso contrário, você poderá obter resultados espúrios.

Para encontrar todos os links de uma só vez, use find para inodes de todos os arquivos em um dispositivo e use coisas como sort e uniq para encontrar duplicatas.

    
por barrycarter 02.11.2017 / 14:43
3

Você poderia fazer algo assim:

find . -type t -ls | grep -v " 1 username"

Isso listará os arquivos no diretório atual e executará um ls nele. Como disse @barrycarter, os hard links são indistinguíveis dos arquivos reais, mas nessa listagem eles aparecerão como tendo mais de um link. Usando grep -v você removeu os arquivos que possuem apenas um link. (O username no comando grep é para fazer o grep olhar no lugar certo para o único 1 . Substitua pelo seu próprio nome de usuário.)

    
por Jos 02.11.2017 / 14:46