Há dois arquivos com link?

24

Como posso saber se dois arquivos têm link físico na linha de comando? por exemplo. algo liga isso:

$ ls
fileA fileB fileC

$ is-hardlinked fileA fileB
yes

$ is-hardlinked fileA fileC
no
    
por Vincent Scheib 07.11.2011 / 23:36

3 respostas

31

Na maioria dos sistemas de arquivos¹, um arquivo é determinado exclusivamente pelo seu número inode , então tudo que você precisa verificar é se dois arquivos têm o mesmo número de inode e estão no mesmo sistema de arquivos.

Ash, ksh, bash e zsh têm uma construção que faz a verificação para você: o operador de igualdade de arquivos -ef .

[ fileA -ef fileB ] && ! [ fileA -ef fileC ]

Para casos mais avançados, ls -i /path/to/file lista o número de inode de um arquivo. df -P /path/to/file mostra em qual sistema de arquivos o arquivo está (se dois arquivos estão no mesmo diretório, eles estão no mesmo sistema de arquivos). Se o seu sistema tiver o comando stat , ele provavelmente mostrará os números do inode e do sistema de arquivos ( stat varia de sistema para sistema, verifique sua documentação). Se você quiser uma rápida olhada nos links físicos de um diretório, tente ls -i | sort (possivelmente canalizados para o awk ).

Todos os sistemas de arquivos unix nativos e alguns outros, como o NTFS, mas possivelmente não casos exóticos como o CramFS.

    
por 07.11.2011 / 23:58
4
function is-hardlinked() {
    r=yes
    [ "'stat -c '%i' $1'" != "'stat -c '%i' $2'" ] && r=no
    echo $r
}
    
por 08.11.2011 / 13:04
3

Como o primeiro pôster sugere, você pode escrever um script baseado em algo assim no Linux:

stat -c '%i' fileA fileB fileC
    
por 08.11.2011 / 00:36

Tags