Puede encontrar el número de inodo para su archivo con
ls -i
y
ls -l
muestra el recuento de referencias (número de enlaces duros a un inodo en particular)
después de encontrar el número de inodo, puede buscar todos los archivos con el mismo inodo:
find . -inum NUM
mostrará los nombres de archivo para el inodo NUM en el directorio actual (.)
Realmente no hay una respuesta bien definida a su pregunta. A diferencia de los enlaces simbólicos, los enlaces físicos no se pueden distinguir del "archivo original".
Las entradas de directorio constan de un nombre de archivo y un puntero a un inodo. El inodo, a su vez, contiene los metadatos del archivo y (punteros a) el contenido real del archivo). Crear un enlace duro crea otro nombre de archivo + referencia al mismo inodo. Estas referencias son unidireccionales (al menos en los sistemas de archivos típicos):el inodo solo mantiene un recuento de referencias. No existe una forma intrínseca de averiguar cuál es el nombre de archivo "original".
Por cierto, esta es la razón por la cual la llamada del sistema para "eliminar" un archivo se llama unlink
. Simplemente elimina un enlace duro. El inodo y los datos adjuntos se eliminan solo si el recuento de referencias del inodo cae a 0.
La única forma de encontrar las otras referencias a un inodo dado es buscar exhaustivamente en el sistema de archivos verificando qué archivos se refieren al inodo en cuestión. Puede usar 'test A -ef B' desde el shell para realizar esta verificación.
UNIX tiene enlaces duros y enlaces simbólicos (hechos con "ln"
y "ln -s"
respectivamente). Los enlaces simbólicos son simplemente un archivo que contiene la ruta real a otro archivo y puede cruzar sistemas de archivos.
Los enlaces duros han existido desde los primeros días de UNIX (que puedo recordar de todos modos, y eso se remonta a bastante tiempo). Son dos entradas de directorio que hacen referencia al exacto mismos datos subyacentes. Los datos en un archivo se especifican por su inode
. Cada archivo en un sistema de archivos apunta a un inodo, pero no existe el requisito de que cada archivo apunte a un inodo único:de ahí provienen los enlaces físicos.
Dado que los inodos son únicos solo para un sistema de archivos dado, existe la limitación de que los enlaces duros deben estar en el mismo sistema de archivos (a diferencia de los enlaces simbólicos). Tenga en cuenta que, a diferencia de los enlaces simbólicos, no hay un archivo privilegiado:todos son iguales. El área de datos solo se liberará cuando todos los archivos que usan ese inodo se eliminan (y todos los procesos también lo cierran, pero ese es un problema diferente).
Puedes usar el "ls -i"
comando para obtener el inodo de un archivo en particular. A continuación, puede utilizar el "find <filesystemroot> -inum <inode>"
Comando para encontrar todos los archivos en el sistema de archivos con ese inodo dado.
Aquí hay un script que hace exactamente eso. Lo invocas con:
findhardlinks ~/jquery.js
y encontrará todos los archivos en ese sistema de archivos que son enlaces duros para ese archivo:
[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
Aquí está el guión.
#!/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