GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie können Sie den tatsächlichen Hardlink von ls sehen?

Sie können die Inode-Nummer für Ihre Datei mit

finden
ls -i

und

ls -l

zeigt die Anzahl der Referenzen (Anzahl der Hardlinks zu einem bestimmten Inode)

Nachdem Sie die Inode-Nummer gefunden haben, können Sie nach allen Dateien mit demselben Inode suchen:

find . -inum NUM

zeigt Dateinamen für Inode NUM im aktuellen Verzeichnis (.)


Auf deine Frage gibt es nicht wirklich eine eindeutige Antwort. Im Gegensatz zu Symlinks sind Hardlinks nicht von der "Originaldatei" zu unterscheiden.

Verzeichniseinträge bestehen aus einem Dateinamen und einem Zeiger auf einen Inode. Der Inode wiederum enthält die Dateimetadaten und (Zeiger auf) den eigentlichen Dateiinhalt). Das Erstellen eines festen Links erstellt einen anderen Dateinamen + Verweis auf denselben Inode. Diese Referenzen sind unidirektional (zumindest in typischen Dateisystemen) – der Inode führt nur eine Referenzzählung. Es gibt keine Möglichkeit herauszufinden, welches der "ursprüngliche" Dateiname ist.

Übrigens heißt deshalb der Systemaufruf zum "Löschen" einer Datei unlink . Es entfernt nur einen Hardlink. Der Inode und angehängte Daten werden nur gelöscht, wenn der Referenzzähler des Inodes auf 0 fällt.

Die einzige Möglichkeit, die anderen Verweise auf einen bestimmten Inode zu finden, besteht darin, das Dateisystem erschöpfend zu durchsuchen und zu prüfen, welche Dateien auf den betreffenden Inode verweisen. Sie können 'test A -ef B' von der Shell verwenden, um diese Prüfung durchzuführen.


UNIX hat feste Links und symbolische Links (erstellt mit "ln" und "ln -s" beziehungsweise). Symbolische Links sind einfach eine Datei, die den tatsächlichen Pfad zu einer anderen Datei enthält und Dateisysteme überschreiten kann.

Feste Links gibt es seit den frühesten Tagen von UNIX (daran kann ich mich sowieso erinnern, und das liegt schon eine ganze Weile zurück). Es sind zwei Verzeichniseinträge, die auf das exakte verweisen gleichen zugrunde liegenden Daten. Die Daten in einer Datei werden durch ihren inode spezifiziert . Jede Datei in einem Dateisystem zeigt auf einen Inode, aber es ist nicht erforderlich, dass jede Datei auf einen eindeutigen Inode zeigt - von dort kommen harte Links.

Da Inodes nur für ein bestimmtes Dateisystem eindeutig sind, gibt es eine Einschränkung, dass harte Links sich auf demselben Dateisystem befinden müssen (im Gegensatz zu symbolischen Links). Beachten Sie, dass es im Gegensatz zu symbolischen Links keine privilegierte Datei gibt – sie sind alle gleich. Der Datenbereich wird erst freigegeben, wenn alle die Dateien, die diesen Inode verwenden, werden gelöscht (und alle Prozesse schließen ihn auch, aber das ist ein anderes Problem).

Sie können den "ls -i" verwenden Befehl, um den Inode einer bestimmten Datei zu erhalten. Sie können dann den "find <filesystemroot> -inum <inode>" verwenden Befehl, um alle Dateien im Dateisystem mit diesem angegebenen Inode zu finden.

Hier ist ein Skript, das genau das tut. Sie rufen es auf mit:

findhardlinks ~/jquery.js

und es findet alle Dateien auf diesem Dateisystem, die feste Links für diese Datei sind:

[email protected]:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
   '/home/pax/jquery.js' has inode 5211995 on mount point '/'
       /home/common/jquery-1.2.6.min.js
       /home/pax/jquery.js

Hier ist das Skript.

#!/bin/bash
if [[ $# -lt 1 ]] ; then
    echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
    exit 1
fi

while [[ $# -ge 1 ]] ; do
    echo "Processing '$1'"
    if [[ ! -r "$1" ]] ; then
        echo "   '$1' is not accessible"
    else
        numlinks=$(ls -ld "$1" | awk '{print $2}')
        inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
        device=$(df "$1" | tail -1l | awk '{print $6}')
        echo "   '$1' has inode ${inode} on mount point '${device}'"
        find ${device} -inum ${inode} 2>/dev/null | sed 's/^/        /'
    fi
    shift
done

Linux
  1. Wie können Sie den Chipsatz eines USB-Geräts unter Linux identifizieren?

  2. Wie kann ich einen Zeilenumbruch löschen, wenn es das letzte Zeichen in einer Datei ist?

  3. Wie können Sie installierte Versionen der glibc-Bibliotheken ermitteln?

  4. Wie kann ich unter Linux den Inhalt einer Datei als Parameter an eine ausführbare Datei übergeben?

  5. Wie kann ich die Größe von Dateien und Verzeichnissen in Linux sehen?

Wie kann ich die Berechtigungen meiner Dateien korrigieren?

Alles Wichtige, was Sie über Hard Link in Linux wissen müssen

Der ln-Befehl unter Linux:Soft- und Hardlinks erstellen

Wie kann ich zwei Abschnitte derselben Datei unterscheiden?

Wie kann ich die Länge einer Videodatei von der Konsole abrufen?

Wie finde ich die älteste Datei in einem Verzeichnisbaum?