
Digamos que cuando lo hago ls -li
dentro 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 findmnt
usted 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 -inum
la opción de buscar:
find /mount/point -xdev -inum 12353538
(algunas find
implementaciones también son compatibles -mount
como equivalente, -xdev
aunque solo -xdev
es estándar).
Respuesta3
ffind
deEl 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/sda3
en 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 stat
binario 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 exit
vs return
dependiendo de cómo uses esto!