[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 30.   Spostamenti e collegamenti di file e directory

Negli ambienti Unix, lo spostamento e il cambiamento del nome di file e directory sono la stessa cosa. Un'altra particolarità dei sistemi operativi Unix è la possibilità di gestire i collegamenti a file e directory.

30.1   Spostamento e ridenominazione

Lo spostamento di file e directory avviene per mezzo di mv. Per esercitarsi con questo comando si preparano alcuni file e alcune directory.

touch alfa[Invio]

touch beta[Invio]

mkdir gamma[Invio]

Come sempre è bene controllare.

ls -l[Invio]

...
-rw-rw-r--   1 tizio    tizio           0 Dec 25 12:46 alfa
-rw-rw-r--   1 tizio    tizio           0 Dec 25 12:46 beta
drwxrwxr-x   2 tizio    tizio        1024 Dec 25 12:46 gamma
...

Si procede rinominando il file alfa in modo che diventi omega.

mv alfa omega[Invio]

ls -l[Invio]

...
-rw-rw-r--   1 tizio    tizio           0 Dec 25 12:46 omega
...

Volendo spostare una serie di file e directory in gruppo, è necessario che la destinazione sia una directory. Con il comando seguente si spostano i due file creati poco prima nella directory gamma/.

mv omega beta gamma[Invio]

ls -l gamma[Invio]

-rw-rw-r--   1 tizio    tizio           0 Dec 25 12:46 beta
-rw-rw-r--   1 tizio    tizio           0 Dec 25 12:46 omega

Generalmente, lo spostamento (o il cambiamento di nome) non fa differenza tra file normali e directory.

mv gamma /tmp[Invio]

Il comando precedente sposta la directory gamma/ in /tmp/.

È importante tenere presente che il comando mv non può cambiare una serie di nomi in modo sistematico. Per esempio, non si può cambiare *.mio in *.tuo.

30.2   Collegamenti

La creazione di un collegamento è un'operazione simile alla copia, con la differenza che invece di creare un duplicato di file e directory, si genera un riferimento agli originali. Ne esistono due tipi: collegamenti simbolici e collegamenti fisici (questi ultimi conosciuti di solito come hard link). In questa esercitazione vengono mostrati solo collegamenti simbolici.

pwd[Invio]

/home/tizio

Il comando utilizzato per creare questi collegamenti è ln; dal momento che si intendono mostrare solo quelli simbolici, viene usata sempre l'opzione -s.

Per esercitarsi con questo comando si preparano alcuni file e directory.

touch uno[Invio]

touch due[Invio]

mkdir tre[Invio]

Come sempre è bene controllare.

ls -l[Invio]

...
-rw-rw-r--   1 tizio    tizio           0 Dec 25 12:46 due
drwxrwxr-x   2 tizio    tizio        1024 Dec 25 12:46 tre
-rw-rw-r--   1 tizio    tizio           0 Dec 25 12:46 uno

Come già si accenna all'inizio, la creazione di un collegamento è un'operazione simile alla copia.

ln -s uno uno.bis[Invio]

Con il comando mostrato sopra, si ottiene un collegamento simbolico, denominato uno.bis, al file uno.

ls -l[Invio]

...
lrwxrwxrwx   1 tizio    tizio           3 Dec 25 12:47 uno.bis -> uno

Da questo momento si può fare riferimento al file uno utilizzando il nome uno.bis.

La creazione di un collegamento a una directory può avvenire nello stesso modo visto per i file (a patto che si tratti di collegamenti simbolici).

ln -s /tmp miatemp[Invio]

Se il comando appena visto ha successo si può raggiungere la directory /tmp/ anche attraverso il riferimento miatemp.

La creazione di un gruppo di collegamenti con un solo comando, può avvenire solo quando la destinazione (l'ultimo nome sulla riga di comando) è una directory. In questo modo si ottiene la creazione di una serie di collegamenti al suo interno.

ln -s /home/tizio/uno* /home/tizio/due tre[Invio]

In questo caso, si generano una serie di collegamenti per tutti i file i cui nomi iniziano per uno e anche per il file due nella directory tre/.

Nell'esempio mostrato sopra, i file per i quali si vogliono creare dei collegamenti simbolici sono stati indicati con il loro percorso assoluto, pur immaginando che la directory /home/tizio/ fosse quella corrente. In tal senso, la directory di destinazione è stata indicata semplicemente in modo relativo. Quando si creano una serie di collegamenti simbolici in una directory come in questo modo, è necessario indicare anche il percorso adeguato nei file (o nelle directory) di origine, perché i nomi ai quali si vuole fare riferimento sono trattati come stringhe.

ls -l tre[Invio]

lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:21 due -> /home/tizio/due
lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:21 uno -> /home/tizio/uno
lrwxrwxrwx   1 tizio    tizio    19 Dec 25 15:21 uno.bis -> /home/tizio/uno.bis

Si può osservare che è stato creato anche un collegamento che punta a un altro collegamento.

Se si cancellano questi collegamenti simbolici nella directory tre/, si può provare a vedere cosa può accadere se non si indica un percorso assoluto:

rm tre/*[Invio]

Intuitivamente si può ritenere che possa essere corretta la creazione dei collegamenti simbolici in questo modo:

ln -s uno* due tre[Invio]

Se però si va a controllare il contenuto della directory tre/, si può notare una cosa strana: i collegamenti simbolici puntano a loro stessi.

ls -l tre[Invio]

lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:25 due -> due
lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:25 uno -> uno
lrwxrwxrwx   1 tizio    tizio    19 Dec 25 15:25 uno.bis -> uno.bis

Inizialmente è difficile capire questa cosa. Conviene provare in modo ancora diverso:

rm tre/*[Invio]

ln -s ./uno* ./due tre[Invio]

ls -l tre[Invio]

lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:30 due -> ./due
lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:30 uno -> ./uno
lrwxrwxrwx   1 tizio    tizio    19 Dec 25 15:30 uno.bis -> ./uno.bis

Se non è ancora chiaro, si provi questo:

rm tre/*[Invio]

ln -s nero/marrone rosso/arancio giallo/verde tre[Invio]

ls -l tre[Invio]

lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:35 marrone -> nero/marrone
lrwxrwxrwx   1 tizio    tizio    15 Dec 25 15:35 arancio -> rosso/arancio
lrwxrwxrwx   1 tizio    tizio    19 Dec 25 15:35 giallo -> giallo/verde

Si intende che i file nero/marrone, rosso/arancio e giallo/verde non esistono; tuttavia, i collegamenti simbolici vengono creati ugualmente.

30.3   Conclusione

Lo spostamento di file e directory avviene in modo simile alla copia, solo che l'origine viene rimossa. Lo spostamento di directory attraverso unità di memorizzazione differenti non è possibile. Lo spostamento erroneo può essere dannoso: se non si fa attenzione si può sovrascrivere qualcosa che ha già lo stesso nome dei file o delle directory di destinazione. Questo è lo stesso tipo di problema che si rischia di incontrare con la copia.

I collegamenti a file e directory permettono di definire percorsi alternativi agli stessi. I collegamenti simbolici vengono creati analizzando i nomi senza verificare che appartengano effettivamente a file o directory reali.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome spostamenti_e_collegamenti_di_file_e_directory.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!