Alle Dateien mit derselben Inode-Nummer auflisten?

Alle Dateien mit derselben Inode-Nummer auflisten?

Nehmen wir an, wenn ich dies ls -liin 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 findmntkö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 findImplementierungen unterstützen auch -mountals Äquivalent, -xdevobwohl nur -xdevStandard ist).

Antwort3

ffindausDas 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/sda3im 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 statBinä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“, returnje nachdem, wie Sie es verwenden!

verwandte Informationen