La comanda ln (de link) crea enllaços: noms nous que apunten a un fitxer o directori existent. N’hi ha de dos tipus, simbòlics i durs, i es comporten de manera molt diferent. Els simbòlics són els que faràs servir el 90 % de les vegades: dreceres a programes, versions «actuals» d’una aplicació, configuracions activades a Apache o Nginx…
Sintaxi
ln [opcions] destí nom_de_l_enllaç
L’ordre és el mateix que a cp: primer allò que ja existeix i després el nom nou. Si l’últim argument és un directori, l’enllaç es crea a dins amb el mateix nom.
Opcions més útils
| Opció | Què fa |
|---|---|
-s | Crea un enllaç simbòlic (sense -s, es crea un enllaç dur) |
-f | Si ja existeix un fitxer amb aquest nom, el substitueix |
-n | Si l’enllaç existent apunta a un directori, el tracta com un fitxer normal (es fa servir amb -sf) |
-r | Amb -s, calcula una ruta relativa des de l’enllaç fins al destí |
-v | Mostra cada enllaç que crea |
-i | Pregunta abans de substituir |
Enllaç simbòlic vs. enllaç dur
Simbòlic (ln -s) | Dur (ln) | |
|---|---|---|
| Què és | Un fitxer petit que conté una ruta | Un altre nom per al mateix fitxer (el mateix inode) |
| Directoris | Sí | No |
| Altres discos o particions | Sí | No, ha de ser al mateix sistema de fitxers |
| Si mous o esborres l’original | L’enllaç es trenca | Les dades continuen accessibles amb l’altre nom |
Com es veu a ls -l | l al principi i nom -> destí | Com un fitxer normal; el comptador d’enllaços puja |
Ho veuràs clar amb un exemple:
$ echo "contingut" > original.txt
$ ln original.txt dur.txt
$ ln -s original.txt simbolic.txt
$ ls -li
162135 -rw-rw-r-- 2 oscar oscar 10 Oct 3 17:53 dur.txt
162135 -rw-rw-r-- 2 oscar oscar 10 Oct 3 17:53 original.txt
162136 lrwxrwxrwx 1 oscar oscar 12 Oct 3 17:53 simbolic.txt -> original.txt
original.txt i dur.txt tenen el mateix número d’inode (162135) i un 2 a la columna d’enllaços: són el mateix fitxer amb dos noms. Si escrius en un, ho veus a l’altre. En canvi, simbolic.txt és un fitxer diferent que només conté el text original.txt.
Ara canviem el nom de l’original:
$ mv original.txt reanomenat.txt
$ cat simbolic.txt
cat: simbolic.txt: No such file or directory
$ cat dur.txt
contingut
L’enllaç simbòlic s’ha trencat (apunta a un nom que ja no existeix), mentre que el dur continua funcionant. Les dades d’un fitxer només s’alliberen quan se n’esborra l’últim nom.
Exemples
Crear una drecera a un programa perquè es pugui executar des de qualsevol lloc:
sudo ln -s /opt/eina/bin/eina /usr/local/bin/eina
Tenir els fitxers de configuració en un repositori i enllaçar-los al directori personal:
ln -s ~/dotfiles/bashrc ~/.bashrc
Un enllaç «actual» que apunta a la versió en ús d’una aplicació, i canviar-lo de versió:
$ ln -s versions/v2.1 actual
$ ln -sfn versions/v2.2 actual
$ ls -l actual
lrwxrwxrwx 1 oscar oscar 13 Oct 3 17:53 actual -> versions/v2.2
Activar un lloc web de Nginx a Debian i Ubuntu, on la configuració activa és un enllaç a la disponible (a Apache, a2ensite fa el mateix per tu):
sudo ln -s /etc/nginx/sites-available/exemple.conf /etc/nginx/sites-enabled/
Veure on apunta un enllaç:
$ readlink simbolic.txt
original.txt
$ readlink -f simbolic.txt # ruta absoluta i final, resolent-ho tot
Trobar enllaços simbòlics trencats:
$ find . -xtype l
./simbolic.txt
Compte amb…
- Les rutes relatives d’un enllaç simbòlic es compten des d’on és l’enllaç, no des d’on ets tu.
ln -s fitxer.txt /tmp/enllaccrea un enllaç a/tmpque busca/tmp/fitxer.txt. Fes servir rutes absolutes, oln -sr, que calcula la ruta relativa correcta. -sfsense-nsobre un enllaç a un directori:ln -sf versions/v2.2 actualno substitueixactual, sinó que crea un enllaç nou dins del directori on apuntaactual. Per canviar el destí d’un enllaç a un directori, fes servir sempreln -sfn.- Els enllaços durs no serveixen com a còpia de seguretat: si modifiques el fitxer, el canvi es veu amb tots els noms, perquè és el mateix fitxer. Les eines de còpia incremental (com
rsync --link-dest) fan servir enllaços durs només per als fitxers que no han canviat entre còpies. - No es poden fer enllaços durs a directoris ni entre sistemes de fitxers diferents:
$ ln dir dirdur
ln: dir: hard link not allowed for directory
$ ln /etc/hostname hn
ln: failed to create hard link 'hn' => '/etc/hostname': Invalid cross-device link