GNU/Linux >> Linux Esercitazione >  >> Linux

Come puoi vedere l'effettivo hard link di ls?

Puoi trovare il numero di inode per il tuo file con

ls -i

e

ls -l

mostra il conteggio dei riferimenti (numero di collegamenti fisici a un particolare inode)

dopo aver trovato il numero di inode, puoi cercare tutti i file con lo stesso inode:

find . -inum NUM

mostrerà i nomi dei file per l'inode NUM nella directory corrente (.)


Non c'è davvero una risposta ben definita alla tua domanda. A differenza dei collegamenti simbolici, i collegamenti fisici sono indistinguibili dal "file originale".

Le voci di directory sono costituite da un nome file e un puntatore a un inode. L'inode a sua volta contiene i metadati del file e (puntatori a) il contenuto effettivo del file). La creazione di un hard link crea un altro nome file + riferimento allo stesso inode. Questi riferimenti sono unidirezionali (almeno nei filesystem tipici):l'inode mantiene solo un conteggio dei riferimenti. Non esiste un modo intrinseco per scoprire qual è il nome file "originale".

A proposito, questo è il motivo per cui la chiamata di sistema per "cancellare" un file si chiama unlink . Rimuove solo un hardlink. L'inode e i dati allegati vengono eliminati solo se il conteggio dei riferimenti dell'inode scende a 0.

L'unico modo per trovare gli altri riferimenti a un dato inode è cercare in modo esaustivo nel file system controllando quali file fanno riferimento all'inode in questione. Puoi usare 'test A -ef B' dalla shell per eseguire questo controllo.


UNIX ha hard link e link simbolici (creati con "ln" e "ln -s" rispettivamente). I collegamenti simbolici sono semplicemente un file che contiene il percorso reale di un altro file e può attraversare i filesystem.

Gli hard link sono in circolazione fin dai primi giorni di UNIX (che posso ricordare comunque, e che risale a un bel po' di tempo fa). Sono due voci di directory che fanno riferimento all'esatto stessi dati sottostanti. I dati in un file sono specificati dal relativo inode . Ogni file su un file system punta a un inode, ma non è necessario che ogni file punti a un inode univoco:è da lì che provengono gli hard link.

Poiché gli inode sono univoci solo per un dato filesystem, c'è una limitazione che i collegamenti fisici devono trovarsi sullo stesso filesystem (a differenza dei collegamenti simbolici). Si noti che, a differenza dei collegamenti simbolici, non esiste un file privilegiato:sono tutti uguali. L'area dati verrà rilasciata solo quando all i file che utilizzano quell'inode vengono eliminati (e anche tutti i processi lo chiudono, ma questo è un problema diverso).

Puoi usare il "ls -i" comando per ottenere l'inode di un particolare file. È quindi possibile utilizzare il "find <filesystemroot> -inum <inode>" comando per trovare tutti i file sul filesystem con quel dato inode.

Ecco uno script che fa esattamente questo. Lo invochi con:

findhardlinks ~/jquery.js

e troverà tutti i file su quel filesystem che sono hard link per quel file:

[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

Ecco lo script.

#!/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. Come posso misurare l'effettivo utilizzo della memoria di un'applicazione o di un processo?

  2. Come posso collegare simbolicamente un file in Linux?

  3. Come puoi determinare le versioni installate delle librerie glibc?

  4. usando Linux come posso passare il contenuto di un file come parametro a un eseguibile?

  5. Come posso vedere la dimensione dei file e delle directory in Linux?

Come posso correggere i permessi dei miei file?

Tutto ciò che è importante sapere su Hard Link in Linux

Il comando ln in Linux:crea collegamenti soft e hard

come posso differenziare due sezioni dello stesso file?

Come posso ottenere la lunghezza di un file video dalla console?

Come posso trovare il file più vecchio in un albero di directory