Gestionar fitxers i directoris a Linux

La comanda ln a Linux: enllaços simbòlics i enllaços durs



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
-sCrea un enllaç simbòlic (sense -s, es crea un enllaç dur)
-fSi ja existeix un fitxer amb aquest nom, el substitueix
-nSi l’enllaç existent apunta a un directori, el tracta com un fitxer normal (es fa servir amb -sf)
-rAmb -s, calcula una ruta relativa des de l’enllaç fins al destí
-vMostra cada enllaç que crea
-iPregunta abans de substituir

Enllaç simbòlic vs. enllaç dur

Simbòlic (ln -s)Dur (ln)
Què ésUn fitxer petit que conté una rutaUn altre nom per al mateix fitxer (el mateix inode)
DirectorisSíNo
Altres discos o particionsSíNo, ha de ser al mateix sistema de fitxers
Si mous o esborres l’originalL’enllaç es trencaLes dades continuen accessibles amb l’altre nom
Com es veu a ls -ll 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/enllac crea un enllaç a /tmp que busca /tmp/fitxer.txt. Fes servir rutes absolutes, o ln -sr, que calcula la ruta relativa correcta.
  • -sf sense -n sobre un enllaç a un directori: ln -sf versions/v2.2 actual no substitueix actual, sinó que crea un enllaç nou dins del directori on apunta actual. Per canviar el destí d’un enllaç a un directori, fes servir sempre ln -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

Comandes relacionades

  • cp: copiar (amb -l o -s, crea enllaços).
  • ls: ls -l mostra on apunten els enllaços, ls -i els inodes.
  • mv i rm: esborrar un enllaç simbòlic no toca l’original.
  • find: cercar enllaços (-type l, -xtype l).
  • file: file enllac diu on apunta.