GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedes ver el enlace duro real por ls?

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

Linux
  1. ¿Cómo se puede identificar el chipset de un dispositivo usb en Linux?

  2. ¿Cómo puedo eliminar una nueva línea si es el último carácter de un archivo?

  3. ¿Cómo puedo vincular un archivo en Linux?

  4. ¿Cómo puede determinar las versiones instaladas de las bibliotecas glibc?

  5. Usando Linux, ¿cómo puedo pasar el contenido de un archivo como parámetro a un ejecutable?

¿Cómo puedo arreglar los permisos de mis archivos?

Todo lo importante que necesita saber sobre Hard Link en Linux

El comando ln en Linux:crear enlaces blandos y duros

¿Cómo puedo diferenciar dos secciones del mismo archivo?

¿Cómo puedo asegurarme de que mi sistema use el archivo ~/.screenrc?

¿Cómo puedo obtener la duración de un archivo de video desde la consola?