Alle Dateieinträge bzw. Verknüpfungen anzeigen, auf die eine inode verweist

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Alle Dateieinträge bzw. Verknüpfungen anzeigen, auf die eine inode verweist

Beitrag von Cordess » 29.03.2023 13:30:24

Ich suche ein Programm, dass mir alle Dateieinträge anzeigt, auf die eine inode verweist.

stat zeigt leider nur an, wie viele Verknüpfungen also Dateieinträge es für einen bestimmten inode oder alternativ Dateinamen gibt, nicht aber welche das sind und wo die liegen.

Ein Skript mit find, ls, grep, awk würde zwar sicher das gewünschte Ergebnis liefern, wäre dafür aber auch langsam.
Jetzt habe ich aber gleich noch eine zweite Frage um zu wissen, ob es überhaupt deutlich schneller gehen kann.
Wo genau im Dateisystem werden die Verknüpfungen gespeichert? Werden die an den Block mit der inode anhängt, so dass man sie einfach anzeigen könnte, sobald man die Inode hat, oder stehen die irgendwo anders und verweisen dann nur auf die Inode. Wenn nämlich letzteres der Fall ist, dann kann es so ein Tool, wie ich es suche, logischerweise nicht geben, zumindest keines, das effizient wäre.
Ein Binärprogramm, dass die Schritte von find, ls usw. in einem vereint ist natürlich schon möglich und schneller als das ständige starten von neuen find, ls usw. Prozessen, aber das meine ich damit jetzt nicht. Die Frage zielt ja auch eher darauf ab, ob der Datenbestand der inode die Information überhaupt schnell liefern könnte. Wenn die Liste mit den Einträgen oder Zeiger davon nämlich in einer Liste angehängt an der inode stehen würde, dann wäre so ein auslesen sehr effizient und schnell zu machen. Nur dann, wenn die Zeiger woanders stehen und auf den Block mit der inode verweisen, wäre das nicht so. Es sei denn natürlich, es sind doppelte Zeiger in beide Richtungen, also einmal ein Zeiger beim Dateinamenseintrag, der auf die Inode verweist und dann nochmal ein Zeiger bei der Inode, der wiederum auf diesen Dateinamenseintrag verweist.

Benutzeravatar
MSfree
Beiträge: 10754
Registriert: 25.09.2007 19:59:30

Re: Alle Dateieinträge bzw. Verknüpfungen anzeigen, auf die eine inode verweist

Beitrag von MSfree » 29.03.2023 13:53:09

Cordess hat geschrieben: ↑ zum Beitrag ↑
29.03.2023 13:30:24
oder stehen die irgendwo anders und verweisen dann nur auf die Inode.
Ja.
Wenn nämlich letzteres der Fall ist, dann kann es so ein Tool, wie ich es suche, logischerweise nicht geben, zumindest keines, das effizient wäre.
Richtig. Man muß praktisch alle Dateinamen und Verzeichnisnamen einsammeln und dann deren Verweise auf die inodes vergleichen und bei Gleichheit ausgeben.

Effizient geht es also nicht

https://unix.stackexchange.com/question ... ode-number.

Benutzeravatar
heisenberg
Beiträge: 3546
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Alle Dateieinträge anzeigen, auf die eine inode verweist

Beitrag von heisenberg » 29.03.2023 14:04:05

Mit stat kannst Du Dir die Inode-Nummer einer Datei heraussuchen. mit debugfs(subcommand ncheck) kannst Du Dir alle Dateien, die per Hardlink auf den gleichen Inode gehen ausgeben lassen.

Wenn man das vom Dateinamen ausgehend machen möchte:

Code: Alles auswählen

#!/bin/bash

LC_ALL=C
file="/usr/lib/python3.4/idlelib/__pycache__/macosxSupport.cpython-34.pyc"
inode="$(stat -c "%i" $file)"
mountpoint="$(stat -c %m -- $file)"
device="$(mount | awk -vmp="$mountpoint" '$3 == mp {print $1}')"

debugfs -R "ncheck $inode" $device
Nur vom Inode ausgehen ist lediglich der letzte Befehl.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Re: Alle Dateieinträge bzw. Verknüpfungen anzeigen, auf die eine inode verweist

Beitrag von Cordess » 29.03.2023 14:30:52

Danke euch beiden, das hat funktioniert.

Ich musste noch den /dev/mapper/ namen als Devicenamen anhängen, weil es eine verschlüsselte Partition ist und ohne dies ansonsten debugfs meldet "ncheck: Filesystem not open".

Aber so:

Code: Alles auswählen

debugfs -R 'ncheck inodeNR' /dev/mapper/[NAME]
funktioniert es.

Antworten