
Nehmen wir an, wenn ich dies ls -li
in einem Verzeichnis mache, erhalte ich Folgendes:
12353538 -rw-r--r-- 6 me me 1650 2013-01-10 16:33 fun.txt
Wie die Ausgabe zeigt, die Dateispaß.txthat6Hardlinks; und die Inode-Nummer ist12353538.
Wie finde ich alle Hardlinks für die Datei, also Dateien mit derselben Inode-Nummer?
Antwort1
Die Grundvoraussetzung ist die Verwendung von:
find /mount/point -mount -samefile /mount/point/your/file
Auf Systemen mit findmnt
können Sie den Einhängepunkt folgendermaßen ableiten:
file=/path/to/your/file
find "$(findmnt -o TARGET -cenT "$file")" -mount -samefile "$file"
Es ist wichtig, nicht von dort aus zu suchen /
, es sei denn, die Zieldatei befindet sich auf diesem Dateisystem, da Inode-Nummern in jedem gemounteten Dateisystem wiederverwendet werden.
Antwort2
Wenn Sie die Inode-Nummer bereits haben, können Sie die Option „find“ verwenden -inum
:
find /mount/point -xdev -inum 12353538
(einige find
Implementierungen unterstützen auch -mount
als Äquivalent, -xdev
obwohl nur -xdev
Standard ist).
Antwort3
ffind
ausDas Detektiv-Kitkann alle Dateinamen für einen Inode finden, einschließlich gelöschter Dateinamen.
Zum Beispiel:
sudo ffind -a /dev/sda3 $(stat --format=%i ~/just_a_test)
Erträge
* /home/me/empty_1
* /home/me/hard_link_to_empty1
/home/me/just_a_test
/home/me/hard_link_to_just_a_test
Bei den Einträgen mit vorangestelltem Stern handelt es sich um frühere Dateinamen, die nicht mehr existieren (weil die Datei umbenannt oder gelöscht wurde).
Ich verwende es $(stat --format=%i ~/just_a_test)
, um den Inode der Datei zu erhalten.
Um die Partition des Dateinamens programmgesteuert zu erhalten ( /dev/sda3
im vorherigen Beispiel), können Sie verwendendf
:
file=~/just_a_test; sudo ffind -a $(df -P "$file" | awk 'END{print $1}') $(stat --format=%i "$file")
Antwort4
Mit Dank für die bisherigen Antworten.
Beachten Sie, dass die stat
Binärdatei nicht nur den Inode, sondern auch den Einhängepunkt des entsprechenden Geräts bereitstellen kann. Der folgende Codeausschnitt verwendet dies, um den „üblichen“ Anwendungsfall zu lösen:
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
und läuft:
> hardlinks ./resources/sphinx/gitinfo.py
/home/user/build/z-documentation/resources/sphinx/gitinfo.py
/home/user/build/sphinx-gitinfo/git/sphinx-gitinfo/gitinfo.py
PS: Achten Sie auf exit
„vs“, return
je nachdem, wie Sie es verwenden!