¿Enumerar todos los archivos con el mismo número de inodo?

¿Enumerar todos los archivos con el mismo número de inodo?

Digamos que cuando lo hago ls -lidentro de un directorio, aparece esto:

12353538 -rw-r--r-- 6 me me 1650 2013-01-10 16:33 fun.txt

Como muestra el resultado, el archivodivertido.txttiene6enlaces duros; y el número de inodo es12353538.

¿Cómo encuentro todos los enlaces físicos del archivo, es decir, archivos con el mismo número de inodo?

Respuesta1

La premisa básica es utilizar:

find /mount/point -mount -samefile /mount/point/your/file

En sistemas con findmntusted puede derivar el punto de montaje de esta manera:

file=/path/to/your/file
find "$(findmnt -o TARGET -cenT "$file")" -mount -samefile "$file"

Es importante no buscar desde /, a menos que el archivo de destino esté en ese sistema de archivos, porque los números de inodo se reutilizan en cada sistema de archivos montado.

Respuesta2

Si ya tiene el número de inodo, puede usar -inumla opción de buscar:

find /mount/point -xdev -inum 12353538

(algunas findimplementaciones también son compatibles -mountcomo equivalente, -xdevaunque solo -xdeves estándar).

Respuesta3

ffinddeEl kit de detectivePuede encontrar todos los nombres de archivos de un inodo, incluidos los nombres de archivos eliminados.

Por ejemplo:

sudo ffind -a /dev/sda3 $(stat --format=%i ~/just_a_test)

rendimientos

* /home/me/empty_1
* /home/me/hard_link_to_empty1
/home/me/just_a_test
/home/me/hard_link_to_just_a_test

Las entradas con una estrella delante son nombres de archivos anteriores que ya no existen (porque se cambió el nombre del archivo o se eliminó).


Lo uso $(stat --format=%i ~/just_a_test)para obtener el inodo del archivo.

Para obtener la partición del nombre del archivo mediante programación ( /dev/sda3en el ejemplo anterior), puede usardf:

file=~/just_a_test; sudo ffind -a $(df -P "$file" | awk 'END{print $1}') $(stat --format=%i "$file")

Respuesta4

Con agradecimiento a las respuestas anteriores.

Tenga en cuenta que el statbinario no solo puede proporcionarle el inodo, sino también el punto de montaje de su dispositivo correspondiente. El siguiente fragmento utiliza esto para resolver el caso de uso "habitual":

fn_hardlinks() {
  declare target; target="$1" && shift
  [ ! -e "$target" ] && \
    { echo "[error] invalid target: '$target'" 1>&2; exit 1; }
  stat '/' 2>/dev/null 1>&2 || \
    { echo "[error] no functioning 'stat' binary found'" 1>&2; exit 1; }
  declare mount; mount="$(stat -c '%m' "$target")"
  declare inode; inode="$(stat -c '%i' "$target")"
  [ "x${mount[-1]}" != "x/" ] && mount+="/"
  find "$mount" -xdev -inum "$inode" 2>/dev/null
}

alias hardlinks=fn_hardlinks

y corriendo:

> hardlinks ./resources/sphinx/gitinfo.py
/home/user/build/z-documentation/resources/sphinx/gitinfo.py
/home/user/build/sphinx-gitinfo/git/sphinx-gitinfo/gitinfo.py

PD: ¡cuidado con exitvs returndependiendo de cómo uses esto!

información relacionada