Comando ln in Linux: creare hard link e collegamenti simbolici

ln crea un altro nome per un file tramite un collegamento fisico (hard link); con -s crea invece un collegamento simbolico che contiene il percorso di un altro elemento. La scelta dipende dal fatto che tu voglia condividere gli stessi dati oppure mantenere un rimando a un percorso, anche su un altro filesystem.

Gli esempi si riferiscono a GNU Coreutils su Linux. Verifica ln --help e man ln sul sistema usato: -r, -n, -T, -t e le opzioni di backup non sono disponibili in tutte le implementazioni.

Che cos'è il comando ln?

Un inode è la struttura con cui un filesystem identifica un file e ne conserva i metadati. Due collegamenti fisici sullo stesso filesystem fanno riferimento allo stesso inode e agli stessi dati: nessuno dei due nomi è una copia indipendente o un nome privilegiato. Un collegamento simbolico è invece un file di tipo speciale con una stringa di percorso; può indicare una directory, attraversare filesystem diversi o esistere anche se il percorso indicato non è disponibile.

Sintassi di base

ln [OPTION]... [-T] TARGET LINK_NAME
ln [OPTION]... TARGET... DIRECTORY

Il primo operando indica il file esistente o la stringa da memorizzare nel collegamento simbolico; il secondo è il nuovo nome. Se l’ultimo operando è una directory esistente, senza -T GNU crea i collegamenti al suo interno usando i nomi finali dei primi operandi. Racchiudi tra virgolette i percorsi con spazi e usa -- per terminare le opzioni quando un nome inizia con un trattino. Lo schema contiene segnaposto e non va eseguito letteralmente.

Uso base di ln

Creare un link fisico

Crea una cartella nuova con mkdir ln-demo && cd ln-demo; se esiste già o la preparazione fallisce, fermati e scegli un altro nome. Crea il file con printf "demo\n" > original.txt e lascia assente hard-link.txt. Dopo ln, stat mostra per entrambi lo stesso numero di inode e, in questa prova, un conteggio di collegamenti pari a 2; i numeri di inode variano. Modificando il contenuto attraverso uno dei due nomi vedrai la modifica anche dall’altro. Il comando non crea le directory genitrici mancanti.

ln original.txt hard-link.txt
stat -c '%i %h %n' original.txt hard-link.txt

Creare un link simbolico

Con -s il primo operando viene registrato come stringa. Il comando seguente crea app-current nella cartella di prova, con il contenuto /opt/myapp/current; non crea e non modifica quel percorso di sistema. readlink deve stampare la stringa anche se la destinazione non esiste: in quel caso il collegamento è interrotto. Il nuovo nome app-current deve essere libero.

ln -s /opt/myapp/current app-current
readlink app-current

Creare più collegamenti in una directory

Crea file1 e file2 nella cartella di prova, poi una directory vuota links. Le due righe seguenti sono alternative: scegli la prima oppure la seconda su una directory links ancora vuota. Entrambe devono creare links/file1 e links/file2 che raggiungono i file nella directory genitrice. Nella prima riga i percorsi ../file1 e ../file2 sono scritti dal punto di vista dei collegamenti; nella seconda GNU -r calcola i percorsi relativi a partire dai file indicati. Ripetere entrambe senza rimuovere prima soltanto i collegamenti di prova produce un errore perché i nomi esistono già.

ln -s ../file1 ../file2 links/
ln -sr -t links file1 file2

Verificare il percorso memorizzato in un collegamento simbolico

Un comando riuscito normalmente non produce messaggi. readlink mostra la stringa memorizzata nel collegamento, senza dimostrare da solo che il file indicato esista. La prova seguente usa una sottocartella nuova per non sovrascrivere original.txt e il suo hard link creati prima; si interrompe se la preparazione o la creazione fallisce.

(
  mkdir link-check || exit 1
  cd link-check || exit 1
  printf 'demo\n' > original.txt || exit 1
  ln -s original.txt shortcut.txt || exit 1
  readlink shortcut.txt
)

L’output atteso è original.txt. Il percorso relativo è interpretato dalla directory che contiene shortcut.txt, non dalla directory corrente di chi lo apre. Spostare soltanto il collegamento può interromperlo; spostare insieme collegamento e destinazione mantenendo la stessa disposizione relativa può conservarne il funzionamento. Controlla anche il codice di uscita: un errore di creazione non viene risolto dal successivo comando di lettura.

Opzioni principali

Opzione Scopo
-s Crea collegamenti simbolici invece di hard link.
-r Con -s calcola il percorso relativo alla posizione del collegamento.
-f Permette di sostituire file di destinazione esistenti. Può rimuovere anche un file normale: verifica tipo e percorso prima dell’uso.
-i Chiede conferma prima di sostituire una destinazione esistente. Dopo un rifiuto controlla il percorso e il codice di uscita della versione installata.
-n Tratta il nome finale come il collegamento stesso se è un collegamento simbolico a directory; non impedisce di usare una directory reale come contenitore.
-T Usa il nome finale come percorso esatto, senza creare il collegamento al suo interno se è una directory.
-b Conserva la destinazione precedente con un nome di backup, normalmente con suffisso ~, salvo configurazione diversa.
-v Mostra il nome dei collegamenti creati.

La specifica POSIX.1-2024 di ln comprende -f, -s, -L e -P; non specifica tutte le opzioni GNU qui descritte. Per creare un hard link da un operando che è già un collegamento simbolico, -L segue la destinazione e -P usa il collegamento stesso; con -s entrambe sono ignorate. Non affidarti allo stesso comportamento predefinito su sistemi diversi.

Esempi pratici

Creare un collegamento simbolico relativo

Per la prima riga prepara mkdir -p releases/2026-09 app nella cartella di prova e lascia assente app/current. Il collegamento contiene ../releases/2026-09 e raggiunge la directory releases/2026-09, perché è interpretato da app. La seconda riga è un’alternativa su un percorso di sistema da adattare: non eseguirla nel laboratorio e verifica prima directory, permessi e assenza del nuovo nome. GNU -r calcola il percorso usando destinazione e directory del collegamento canonicalizzate, cioè risolvendo gli eventuali collegamenti simbolici incontrati nei loro nomi; non conserva necessariamente lo stesso percorso testuale fornito.

ln -s ../releases/2026-09 app/current
ln -sr /srv/app/releases/2026-09 /srv/app/current

Sostituire un collegamento di distribuzione

Nella cartella di prova crea anche releases/2026-10 e un nuovo collegamento current con ln -s releases/2026-09 current; è distinto da app/current. Verifica prima test -L current e il valore stampato dal primo readlink. Se il percorso è un file normale, una directory reale o non è quello previsto, fermati. La riga con -sfnT sostituisce esattamente current: -T impedisce di creare un altro nome dentro una directory finale e rende superfluo -n, ma -f può comunque sostituire un file normale. L’output finale atteso è releases/2026-10. Conserva il valore precedente: per tornare indietro, dopo nuovi controlli puoi ripristinare il collegamento a releases/2026-09. Il cambio di collegamento non annulla le altre operazioni di una distribuzione né aggiorna automaticamente i file già aperti dai processi.

readlink current
ln -sfnT releases/2026-10 current
readlink current

Controllare tipo e risoluzione del collegamento

Le righe seguenti usano app-current creato prima. ls -l mostra il tipo e il rimando; readlink stampa /opt/myapp/current. In GNU readlink -f canonicalizza il percorso, ma può accettare l’ultimo componente mancante: se manca una directory precedente, fallisce. Non usarlo come prova che l’intera destinazione esista. stat, senza -L, descrive il collegamento stesso; con stat -L app-current esamini invece la destinazione, se accessibile. Se ti serve che tutti i componenti esistano, usa readlink -e e considera anche errori di permesso o cicli di collegamenti.

ls -l app-current
readlink app-current
readlink -f app-current
stat app-current

ln e comandi correlati

Comando o metodo Ruolo principale Quando usarlo
Collegamento fisico (hard link) Un altro nome per lo stesso inode File regolari sullo stesso filesystem, con dati condivisi
Collegamento simbolico Un file speciale che contiene un percorso Directory, percorsi su altri filesystem e rimandi a versioni
cp Creare una copia modificabile separatamente Quando i dati devono poter cambiare indipendentemente
Bind mount Rendere accessibile un percorso in un altro punto di montaggio Esposizione di directory tramite il sistema dei mount, senza creare un normale collegamento simbolico

Avvertenze importanti

Ricordare l’ordine degli operandi

La forma comune è ln TARGET LINK_NAME: prima il file o il percorso indicato, poi il nuovo nome. Senza -s il primo percorso deve esistere; con -s è una stringa e può indicare un elemento assente. Per impostazione predefinita un nome finale già esistente non viene sostituito. Non aggiungere -f solo per far scomparire un errore: controlla quale percorso verrebbe sostituito.

Calcolare i percorsi relativi dalla posizione del collegamento

Una stringa valida dalla shell corrente può risultare sbagliata da un’altra directory. Per esempio, dentro links/file1 la stringa file1 rimanderebbe a links/file1 stesso, creando un ciclo; ../file1 raggiunge invece il file nella directory genitrice. Anche un collegamento esistente e ben formato può non essere risolvibile per permessi insufficienti o per un ciclo.

Rispettare i limiti dei collegamenti fisici

Un hard link non attraversa il confine fra filesystem: due numeri di inode uguali su filesystem diversi non identificano necessariamente lo stesso file. In Linux i collegamenti fisici alle directory sono normalmente vietati e possono esserci ulteriori restrizioni di proprietà o permessi. Non usare un hard link come backup indipendente: una modifica dei dati attraverso un nome si vede anche dagli altri.

FAQ

Il comando ln crea un collegamento simbolico per impostazione predefinita?

No. Per impostazione predefinita crea un collegamento fisico. Per memorizzare un percorso in un collegamento simbolico devi specificare -s.

Cancellare il nome originale distrugge un file con collegamento fisico?

No. Eliminare un nome non distrugge i dati finché un altro hard link li mantiene raggiungibili. Modificare o troncare il file attraverso uno dei nomi modifica però gli stessi dati condivisi.

Come verificare un collegamento simbolico non risolvibile?

Controlla che test -L nome riconosca un collegamento simbolico e leggi la stringa con readlink nome. readlink -e nome richiede che tutti i componenti esistano e siano risolvibili. test -L nome && test ! -e nome può segnalare un collegamento non risolvibile, ma un risultato negativo di test -e può dipendere anche da permessi o cicli: non prova da solo che il file sia stato cancellato.

È meglio un percorso assoluto o relativo nel collegamento simbolico?

Un percorso relativo è utile se collegamento e destinazione vengono spostati insieme mantenendo la loro disposizione. Un percorso assoluto continua a indicare lo stesso percorso di sistema quando sposti soltanto il collegamento. La scelta dipende anche dall’ambiente in cui il percorso viene risolto, per esempio un contenitore o un filesystem condiviso.

Documentazione di riferimento