Ci sono molte risposte abbastanza corrette qui, ma non credo che nessuno abbia davvero affrontato la percezione sbagliata originale. La domanda originale è sostanzialmente "quando creo un collegamento simbolico, è facile identificarlo in seguito. Ma non riesco a capire come identificare un collegamento reale". E sì, le risposte sostanzialmente si riducono a "non puoi", e più o meno spiegano perché, ma nessuno sembra aver riconosciuto che, in realtà, è confuso e strano.
Se stai leggendo tutto questo e hai capito cosa sta succedendo, allora sei bravo; non hai bisogno di leggere il mio pezzettino. Se sei ancora confuso, allora continua.
La risposta davvero molto breve è che un collegamento reale non è affatto un collegamento, non come un collegamento simbolico. È una nuova voce nella struttura della directory che punta allo stesso gruppo di byte della voce della directory originale e, una volta creata, è "reale" e legittima come la prima. Ogni file 'normale' sul tuo disco ha almeno un collegamento reale; senza quello, non lo vedresti in nessunodirectory e non sarebbe in grado di fare riferimento a esso o utilizzarlo. Quindi, se si dispone di un file Fred.txt e si collega ad esso Wilma.txt e Barney.txt, tutti e tre i nomi (e le voci della directory) si riferiscono allo stesso file e sono tutti ugualmente validi. Non c'è modo per il sistema operativo di dire che una delle voci è stata creata quando si preme "salva" nell'editor di testo e le altre sono state create con il comando "ln".
Il sistema operativo non deve tenere traccia di come molte voci differenti puntano allo stesso file, però. Se elimini Wilma.txt, non sorprende che non liberi spazio sul tuo disco. Ma se elimini Fred.txt (il file 'originale'), non libererai ancora spazio sul tuo disco, perché i dati sul disco che erano conosciuti come Fred.txt sono ancora Barney.txt. Solo quando si eliminano tutte le voci della directory, il sistema operativo disalloca lo spazio occupato dai dati stessi.
Se Barney.txt fosse stato un collegamento simbolico, l'eliminazione di Fred.txt avrebbe disallocato lo spazio e Barney.txt ora sarebbe un collegamento interrotto. Inoltre, se sposti o rinomini un file che ha un collegamento simbolico puntato verso di esso, interrompi il collegamento. Ma puoi spostare o rinominare un file hard-link tutto quello che vuoi senza rompere le altre voci di directory che puntano a quel file / dato, perché tutte sono voci di directory che si riferiscono allo stesso blocco di dati sull'unità (usando il inode # di tali dati).
[Sono passati due anni e quell'ultima parte mi ha confuso per un minuto, quindi penso che chiarirò. Se digiti "mv ./Wilma.txt ../elsewhere/Betty.txt" sembra che tu stia spostando il file, ma in realtà non lo sei. Quello che stai realmente facendo è rimuovere un elemento pubblicitario dall'elenco di directory della tua directory corrente, quello che dice "il nome 'Wilma.txt' è associato ai dati che puoi trovare usando l'inode ###### #, "e aggiungendo un nuovo elemento pubblicitario all'elenco di directory della directory ../elsewhere che dice" il nome 'Betty.txt' è associato ai dati che possono essere trovati tramite l'inode ####### ". Questo è il motivo per cui puoi "spostare" un file da 2 gigabyte con la stessa velocità di un file da 2 kilobyte, purché tu li sposti in un'altra posizione sulla stessa unità.]
Poiché il sistema operativo deve tenere traccia del numero di voci di directory diverse che puntano allo stesso blocco di dati, è possibile sapere se un determinato file è stato collegato in modo rigido, anche se non si può dire con certezza se la voce di directory che si stai guardando è quello "originale" o no. Un modo è il comando "ls", in particolare "ls -l" (che è una L minuscola dopo il trattino)
Per prendere in prestito un esempio precedente ....
-rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f1
La prima lettera è un trattino, quindi non è una directory o qualcos'altro esotico, è un file ordinario "normale". Ma se fosse veramente ordinario, quel numero dopo la parte rwx-ish sarebbe "1", come in "c'è una voce di directory che punta a questo blocco di dati". Ma fa parte di una dimostrazione di collegamenti reali, quindi dice "3".
Nota che questo può eventualmente portare a comportamenti strani e misteriosi (se non hai avvolto la testa attorno a collegamenti duri, cioè). Se apri Fred.txt nel tuo editor di testo e apporti alcune modifiche, vedrai le stesse modifiche in Wilma.txt e Barney.txt? Può essere. Probabilmente. Se l'editor di testo salva le modifiche aprendo il file originale e scrivendone le modifiche, sì, tutti e tre i nomi rimarranno comunque puntati sullo stesso testo (appena modificato). Ma se il tuo editor di testo crea un nuovo file (Fred-new-temp.txt), scrive la versione modificata in quella versione, quindi elimina Fred.txt, quindi rinomina Fred-new-temp.txt in Fred.txt, Wilma e Barney lo faranno punta ancora alla versione originale, non alla nuova versione modificata. Se non capisci gli hard link, questo potrebbe farti impazzire leggermente. :) [Okay, non ne conosco personalmente nessunoeditor di testo che farebbero il nuovo file / rinominino, ma conosco molti altri programmi che fanno esattamente questo, quindi state attenti.]
Un'ultima nota: una delle cose che 'fsck' (controllo del file system) verifica è se ci sono blocchi di dati sul disco che in qualche modo non fanno più riferimento a nessuna voce della directory. A volte qualcosa va storto e l'unica voce della directory che punta a un inode viene eliminata ma lo spazio sul disco stesso non viene contrassegnato come "disponibile". Quindi uno dei lavori di fsck è quello di far corrispondere tutto lo spazio allocato con tutte le voci della directory per assicurarsi che non ci siano file senza riferimento. Se ne trova alcune, crea nuove voci di directory e le inserisce in "lost + found".