Puoi trovare il numero di inode per il tuo file con
ls -i
e
ls -l
mostra il conteggio dei riferimenti (numero di collegamenti fisici a un particolare inode)
dopo aver trovato il numero di inode, puoi cercare tutti i file con lo stesso inode:
find . -inum NUM
mostrerà i nomi dei file per l'inode NUM nella directory corrente (.)
Non c'è davvero una risposta ben definita alla tua domanda. A differenza dei collegamenti simbolici, i collegamenti fisici sono indistinguibili dal "file originale".
Le voci di directory sono costituite da un nome file e un puntatore a un inode. L'inode a sua volta contiene i metadati del file e (puntatori a) il contenuto effettivo del file). La creazione di un hard link crea un altro nome file + riferimento allo stesso inode. Questi riferimenti sono unidirezionali (almeno nei filesystem tipici):l'inode mantiene solo un conteggio dei riferimenti. Non esiste un modo intrinseco per scoprire qual è il nome file "originale".
A proposito, questo è il motivo per cui la chiamata di sistema per "cancellare" un file si chiama unlink
. Rimuove solo un hardlink. L'inode e i dati allegati vengono eliminati solo se il conteggio dei riferimenti dell'inode scende a 0.
L'unico modo per trovare gli altri riferimenti a un dato inode è cercare in modo esaustivo nel file system controllando quali file fanno riferimento all'inode in questione. Puoi usare 'test A -ef B' dalla shell per eseguire questo controllo.
UNIX ha hard link e link simbolici (creati con "ln"
e "ln -s"
rispettivamente). I collegamenti simbolici sono semplicemente un file che contiene il percorso reale di un altro file e può attraversare i filesystem.
Gli hard link sono in circolazione fin dai primi giorni di UNIX (che posso ricordare comunque, e che risale a un bel po' di tempo fa). Sono due voci di directory che fanno riferimento all'esatto stessi dati sottostanti. I dati in un file sono specificati dal relativo inode
. Ogni file su un file system punta a un inode, ma non è necessario che ogni file punti a un inode univoco:è da lì che provengono gli hard link.
Poiché gli inode sono univoci solo per un dato filesystem, c'è una limitazione che i collegamenti fisici devono trovarsi sullo stesso filesystem (a differenza dei collegamenti simbolici). Si noti che, a differenza dei collegamenti simbolici, non esiste un file privilegiato:sono tutti uguali. L'area dati verrà rilasciata solo quando all i file che utilizzano quell'inode vengono eliminati (e anche tutti i processi lo chiudono, ma questo è un problema diverso).
Puoi usare il "ls -i"
comando per ottenere l'inode di un particolare file. È quindi possibile utilizzare il "find <filesystemroot> -inum <inode>"
comando per trovare tutti i file sul filesystem con quel dato inode.
Ecco uno script che fa esattamente questo. Lo invochi con:
findhardlinks ~/jquery.js
e troverà tutti i file su quel filesystem che sono hard link per quel file:
[email protected]:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
'/home/pax/jquery.js' has inode 5211995 on mount point '/'
/home/common/jquery-1.2.6.min.js
/home/pax/jquery.js
Ecco lo script.
#!/bin/bash
if [[ $# -lt 1 ]] ; then
echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
exit 1
fi
while [[ $# -ge 1 ]] ; do
echo "Processing '$1'"
if [[ ! -r "$1" ]] ; then
echo " '$1' is not accessible"
else
numlinks=$(ls -ld "$1" | awk '{print $2}')
inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
device=$(df "$1" | tail -1l | awk '{print $6}')
echo " '$1' has inode ${inode} on mount point '${device}'"
find ${device} -inum ${inode} 2>/dev/null | sed 's/^/ /'
fi
shift
done