localiza todos os arquivos vinculados entre dois diretórios

1

Como faço para descobrir se algum arquivo entre dois ou mais diretórios está vinculado? Em outras palavras, algum arquivo em dois ou mais diretórios se refere ao mesmo arquivo?

Semelhante a Como encontrar todos os links para um determinado arquivo? [duplicar] e Listar todos os arquivos com o mesmo número de inode? . No entanto, estou querendo saber como procurar qualquer arquivos com hardlink diretórios diferentes .

    
por JamesThomasMoon1979 12.04.2016 / 04:27

2 respostas

3

Você pode usar find para listar o número de inode de todos os arquivos nos diretórios que possuem mais de 1 link, depois classificar o resultado e extrair as linhas nas quais o mesmo inode aparece mais de uma vez. Obviamente, os diretórios devem estar no mesmo sistema de arquivos:

find dir1 dir2 ... -type f -links +1 -printf '%i %p\n' |
sort -n -k1,1 |
awk '{   same = ($1==last)
         if(!same)save = $0
         else{ if(save!=""){ print save; save = "" }
                print 
         }
         last = $1
}'

Este código imprime os arquivos e seus inodes. Para pessoas sem find -printf , use -ls , que imprime um pouco mais, mas o fará.

    
por 12.04.2016 / 10:41
0

Este comando find deve imprimir todos os arquivos no diretório ./b que vincula a arquivos no diretório ./a .

find ./a -type f -exec find ./b -samefile {} -printf "%p hard link to {}" \;

Um exemplo, dados caminhos de arquivo e números de inode

$ find -type f -printf '%p:%i\n' | sort | column -t -s:
./a/f  12977541
./b/f  12977577  # unique file
./c/f  12977541  # points to same file as path ./a/f
#file  inode

Execute o comando find no diretório ./a e ./b para encontrar qualquer arquivo com link físico no diretório ./c .

 $ find ./a ./b -type f -exec find ./c -samefile {} -printf "%p hard link to {}" \;
 ./c/f hard link to ./a/f


Esta é uma operação O (n ^ 2) . Vai demorar muito tempo, dado um grande número de arquivos!

Usando o GNU find 4.4.2 , linux 3.13.0-85 , Ubuntu 14.04 .

    
por 12.04.2016 / 04:27