Nei sistemi in stile Unix, la struttura dei dati che rappresenta gli oggetti del filesystem (in altre parole, i dati su un file), è memorizzata in quello che viene chiamato un "inode".
Il nome di un file è solo un collegamento a questo inode e viene definito "collegamento reale". Non vi è alcuna differenza tra il nome assegnato a un file e qualsiasi collegamento successivo. Quindi la risposta è "sì": un hard link è un file normale e, in effetti, un file normale è un hard link.
Il ls
comando ti mostrerà quanti hard link ci sono al file.
Per esempio:
seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
Qui abbiamo creato un file chiamato /tmp/hello.txt
. L' 1
output da ls -l
indica che esiste 1 link reale a questo file. Questo hard link è il nome file stesso /tmp/hello.txt
.
Se ora creiamo un altro collegamento reale a questo file:
seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
ora puoi vedere che entrambi i nomi dei file indicano che ci sono 2 hard link al file. Nessuno di questi è il nome file "corretto", sono entrambi ugualmente validi. Possiamo vedere che entrambi puntano allo stesso inode (in questo caso, 5374043):
seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt 5374043 /tmp/hello.txt
C'è un malinteso comune sul fatto che questo sia diverso per le directory. Ho sentito gente dire che il numero di collegamenti restituiti da ls
una directory è il numero di sottodirectory, incluso .
e ..
che non è corretto . O almeno, mentre ti darà il numero corretto, è giusto per le ragioni sbagliate!
Se creiamo una directory e facciamo una ls -ld
otteniamo:
seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct 4 13:20 /tmp/testdir
Questo mostra che ci sono 2 hard link a questa directory. Questi sono:
/tmp/testdir
/tmp/testdir/.
Nota che non/tmp/testdir/..
è un collegamento a questa directory, è un collegamento a . E questo ti dice perché il "numero di sottodirectory" funziona. Quando creiamo una nuova sottodirectory:/tmp
seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct 4 13:24 /tmp/testdir
ora puoi vedere che ci sono 3 hard link alla /tmp/testdir
directory. Questi sono:
/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..
Quindi ogni nuova sottodirectory aumenterà il conteggio dei collegamenti di uno, a causa della ..
voce che contiene.