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


Capitolo 182.   Copia, collegamento, spostamento e cancellazione

La copia, il collegamento, lo spostamento e la cancellazione, sono fasi fondamentali dell'amministrazione dei dati, ma nello stesso modo sono anche operazioni molto delicate.

Tabella 182.1. Riepilogo dei programmi comuni per la copia, la creazione di collegamenti, lo spostamento e la cancellazione di file e directory.

Programma Descrizione
cp Copia.
ln Crea dei collegamenti.
install Copia attribuendo permessi e proprietà ai file di destinazione.
dd Copia a basso livello.
dd_rescue Copia a basso livello, con la possibilità di recuperare i dati leggibili anche in presenza di problemi di lettura nell'unità di memorizzazione.
mv Sposta o rinomina i file.
rm Cancella.
unlink Cancella un file.
shred Fa sparire il contenuto di un file.

182.1   Copia e collegamento

La copia genera un altro file o un'altra directory, il collegamento genera un riferimento aggiuntivo agli stessi dati di origine: assomiglia alla copia, ma rappresenta solo un modo per fare apparire la stessa cosa in più punti differenti.

Nei sistemi Unix i collegamenti sono molto importanti e vengono usati di frequente. Si distinguono due tipi di questi: collegamenti simbolici (symbolic link) e collegamenti fisici (hard link). Attraverso il collegamento fisico si creano dei riferimenti a dati esistenti in modo non distinguibile da quelli originali; i collegamenti simbolici sono dei file speciali e per questo distinguibili dai file originali.

A fianco del problema della copia di file (o di directory), cioè di entità virtuali per il contenimento dei dati, ci può essere il problema elementare (anche se complicato per l'utente) di trasferire dati attraverso i dispositivi in modo diretto (copia a basso livello).

182.1.1   Collegamenti simbolici

Si è accennato al fatto che i collegamenti simbolici sono dei file speciali, distinguibili dai file originali. Si creano normalmente utilizzando il programma ln, con l'opzione -s, come nell'esempio seguente:

ln -s /bin/sh ./sh[Invio]

Seguendo l'esempio, se si leggono le caratteristiche del file ./sh attraverso ls, si può notare l'indicazione esplicita del fatto che si tratta di un riferimento al file /bin/sh (il quale potrebbe essere un altro collegamento, ma questo adesso non è importante).

ls -l sh[Invio]

lrwxrwxrwx   1 tizio    tizio           7 Mar  2 10:16 sh -> /bin/sh

La lettera che appare all'inizio dei permessi, «l», indica esplicitamente che si tratta di un collegamento simbolico. Alla fine, viene indicato anche a chi punta il collegamento: -> /bin/sh.

Si può osservare inoltre che i permessi di un collegamento simbolico non esistono. Formalmente vengono mostrati come attivi tutti i permessi degli ultimi 9 bit (lettura, scrittura ed esecuzione per tutti gli utenti), perché quelli che contano sono in realtà i permessi del file (o della directory) cui effettivamente punta il collegamento simbolico.

L'esistenza dei collegamenti simbolici altera la logica normale della copia: ha senso copiare i file a cui i collegamenti puntano, o ha senso copiare i collegamenti? Solitamente si considera che la gestione dei collegamenti simbolici debba essere trasparente, come se questi non esistessero e si trattasse effettivamente dei file a cui loro puntano. Ma ciò vale fino a quando non si fa esplicitamente riferimento ai collegamenti in quanto tali.

182.1.2   Collegamenti fisici

La gestione dei collegamenti fisici è più seria, nel senso che deve essere riservata a situazioni di particolare necessità. Attraverso il collegamento fisico si creano dei riferimenti a dati esistenti in modo non distinguibile da quelli originali; in pratica, due o più voci nella stessa directory, o in directory differenti, possono puntare allo stesso file.

Quando si cancella un file, si elimina il riferimento al suo inode dalla directory che lo contiene formalmente. Quando un inode non ha più riferimenti, viene considerato libero e può essere riutilizzato per un altro file. In altre parole, se si utilizzano i collegamenti fisici, un file viene cancellato effettivamente quando sono stati eliminati tutti i riferimenti a questo.

Per comprendere in pratica cosa accade, si può provare con gli esempi seguenti.

touch mio_file[Invio]

ls -l mio_file[Invio]

-rw-rw-r--   1 tizio    tizio           0 Mar  2 10:48 mio_file

ln mio_file tuo_file[Invio]

ls -l mio_file tuo_file[Invio]

-rw-rw-r--   2 tizio    tizio           0 Mar  2 10:48 mio_file
-rw-rw-r--   2 tizio    tizio           0 Mar  2 10:48 tuo_file

Come si vede, con questa serie di operazioni si è giunti ad avere due file, apparentemente indipendenti, ma se viene modificato il contenuto di uno si vedono le modifiche anche sull'altro. Dal momento che i permessi e la proprietà dei file (UID e GID) sono informazioni contenute nell'inode, la modifica di questi si ripercuote su tutti i collegamenti.

Si può osservare il numero che appare dopo i permessi, due, che indica quanti riferimenti ha l'inode corrispondente. In pratica, quel numero indica quante voci puntano a quello stesso file. Non si può sapere facilmente quali siano gli altri riferimenti. Si può solo conoscere il numero dell'inode.

ls -l -i mio_file tuo_file[Invio]

270385 -rw-rw-r--   2 tizio    tizio           0 Mar  2 10:48 mio_file
270385 -rw-rw-r--   2 tizio    tizio           0 Mar  2 10:48 tuo_file

Come si vede, i due file hanno lo stesso inode (il numero che appare prima dei permessi), quindi sono lo stesso file.

182.1.3   Directory e collegamenti fisici

Ogni directory contiene due riferimenti convenzionali: uno a se stessa e uno alla directory genitrice (. e ..). Si tratta di nomi di file a tutti gli effetti, che puntano agli inode della directory stessa e di quella precedente.

l'inode di una directory ha pertanto almeno due riferimenti: quello che serve a raggiungere la directory stessa, a partire dalla sua directory genitrice, e quello rappresentato dal punto singolo (la stessa directory).

Quando una directory ne contiene un'altra, allora il numero di riferimenti alla directory di partenza aumenta, perché la directory che si aggiunge ha un riferimento alla sua directory genitrice.

mkdir miadir[Invio]

ls -l -d -i miadir[Invio]

 157715 drwxrwxr-x   2 tizio    tizio        1024 Mar  2 11:22 miadir

L'esempio mostra semplicemente il riferimento alla directory miadir/ contenuto nella sua directory genitrice. Si può provare a leggere il contenuto della directory appena creata.

cd miadir[Invio]

ls -l -i -a miadir[Invio]

 157715 drwxrwxr-x   2 tizio    tizio        1024 Mar  2 11:22 .
 536615 drwxrwxr-x   3 tizio    tizio        3072 Mar  2 11:22 ..

Come si può osservare, il file indicato con un punto singolo (.) ha lo stesso numero di inode della directory miadir/, cosa che spiega il motivo per cui una directory ha almeno due riferimenti (collegamenti fisici).

La directory genitrice, rappresentata dai due punti in sequenza (..), ha tre riferimenti totali per il solo fatto che esiste questa directory (in pratica: i due riferimenti naturali, più questo, perché esiste questa directory).

Figura 182.8. Modello di esempio del comportamento dei collegamenti.

collegamenti

182.1.4   Errori comuni con i collegamenti simbolici

Quando si creano collegamenti fisici, gli argomenti del comando ln, che rappresentano i file di origine, servono a individuare gli inode, a cui si vuole fare riferimento nella destinazione. Al contrario, quando si creano collegamenti simbolici, gli argomenti che rappresentano l'origine vengono trattati semplicemente come stringhe da riprodurre nei riferimenti della destinazione. Ignorando questo particolare, è facile fare degli errori senza comprenderne la ragione. Si osservino i comandi seguenti:

cd[Invio]

pwd[Invio]

/home/tizio

mkdir prova[Invio]

cd prova[Invio]

pwd[Invio]

/home/tizio/prova

ln -s /bin/* .[Invio]

Così facendo si creano dei collegamenti simbolici ai file e alle directory contenuti all'interno della directory /bin/, con lo stesso nome che hanno nell'origine. Per esempio, il collegamento simbolico /home/tizio/prova/sh punta precisamente a /bin/sh. Si osservi invece la sequenza di comandi seguente:

cd /bin[Invio]

pwd[Invio]

/bin

mkdir ~/prova[Invio]

ln -s * ~/prova[Invio]

Se si va nella directory ~/prova/, si può osservare che i collegamenti puntano invece a loro stessi; per esempio, ~/prova/sh punta a sh, ovvero a nulla che possa servire. Infatti, quando si dà il comando ln -s * ~/prova, si ottiene l'espansione dell'asterisco nell'elenco dei nomi (file e directory) contenuti nella directory corrente, che vengono usati tali e quali per la preparazione dei collegamenti. Pertanto, nella destinazione i collegamenti puntano poi ai loro stessi nomi.

182.1.5   Utilizzo di «cp»

Il programma di servizio cp(1) (copy) copia i file:

cp [opzioni] origine destinazione
cp [opzioni] origine... directory

Se vengono specificati solo i nomi di due file, il primo viene copiato sul secondo, viene cioè generata una copia che ha il nome indicato come destinazione. Se il secondo nome indicato è una directory, il file viene copiato con lo stesso nome nella directory. Se vengono indicati più file, l'ultimo nome deve essere una directory e vengono generate le copie di tutti i file nella directory di destinazione. In mancanza di opzioni particolari, le directory non vengono copiate.

Nell'uso di cp occorre fare attenzione, perché si possono sovrascrivere altri file senza ottenere alcun preavviso. Per ridurre le possibilità di errori, conviene creare un alias in modo che cp funzioni sempre con l'opzione -i. Se poi si ha la necessità di sovrascrivere i file di destinazione, si può utilizzare l'opzione -f.

Tabella 182.12. Alcune opzioni di cp nella versione GNU. Le opzioni evidenziate sono conformi allo standard POSIX.

Opzione Descrizione
-a
--archive
Equivalente a -dpR, utile per l'archiviazione o comunque per la copia di collegamenti simbolici così come sono.
-b
--backup
Mantiene delle copie di sicurezza dei file che vengono sovrascritti con la copia.
-d
--no-dereference
Copia i collegamenti simbolici mantenendoli come tali, invece di copiare i file a cui i collegamenti si riferiscono.
-f
--force
Sovrascrittura forzata dei file di destinazione.
-i
--interactive
Richiede una conferma per la sovrascrittura nel caso in cui esistano già dei file con i nomi uguali a quelli di destinazione della copia.
-l
--link
Crea un collegamento fisico invece di copiare i file (non vale per le directory).
-s
--symbolic-link
Crea un collegamento simbolico invece di copiare i file (non vale per le directory).
-P
-d
--no-dereference
Copia i collegamenti simbolici come tali, invece di copiare i file a cui puntano.
--parents
Copia anche il percorso indicato nel file di origine.
-p
--preserve
Mantiene le proprietà, le modalità dei permessi originali e le date originali.
-r
Copia file e directory in modo ricorsivo (includendo le sottodirectory), considerando tutto ciò che non è una directory come un file normale.
L'opzione -r è prevista dallo standard POSIX, ma viene considerata obsoleta e candidata per l'eliminazione futura.
-R
--recursive
Copia file e directory in modo ricorsivo (includendo le sottodirectory).
-S suffisso_di_backup
--suffix=suffisso_di_backup
Permette di definire il suffisso da utilizzare per le eventuali copie di sicurezza delle versioni precedenti. Se non viene specificato con questa opzione, si utilizza il simbolo contenuto nella variabile di ambiente SIMPLE_BACKUP_SUFFIX. Se anche questa variabile non è stata predisposta, si utilizza il simbolo tilde (~).
-V tipo_di_backup
--version-control=tipo_di_backup
Permette di definire esplicitamente il modo con cui gestire le copie di sicurezza delle versioni precedenti, quando si usa anche l'opzione -b. Per la precisione cambia il tipo di estensione che viene aggiunto ai file:
con t o numbered le copie di sicurezza hanno un'estensione numerata;
con nil o existing si mantengono le copie di sicurezza solo per i file che hanno già una o più copie di sicurezza numerate;
con never o simple si ottiene una copia di sicurezza semplice, costituita da una sola copia.
Se questa opzione non viene indicata, si prende in considerazione il valore della variabile di ambiente VERSION_CONTROL.

Tabella 182.13. Variabili di ambiente

Variabile Descrizione
VERSION_CONTROL
Permette di definire la modalità di gestione delle copie di sicurezza delle versioni precedenti in modo predefinito. I valori attribuibili a questa variabile sono gli stessi utilizzati come argomento dell'opzione -V.
SIMPLE_BACKUP_SUFFIX
Definisce il simbolo da utilizzare come suffisso per i nomi dei file che rappresentano le copie di sicurezza.

Segue la descrizione di alcuni esempi.

È molto importante comprendere la differenza tra le opzioni -r e -R. La seconda è quella che rappresenta meglio la ricorsività della copia, perché la prima tratta i file FIFO e alcuni file speciali come file normali. Per comprendere la cosa, si può procedere con l'esempio seguente, in cui si crea prima una directory, all'interno della quale si inserisce un file FIFO:

mkdir prova_1[Invio]

mknod coda p[Invio]

In questo modo, si ottiene il file FIFO prova_1/coda. Volendo copiare la directory prova_1 in prova_2, includendo il file FIFO coda, si deve procedere nel modo seguente:

cp -R prova_1 prova_2[Invio]

Al contrario, utilizzando l'opzione -r, la copia non si concluderebbe, perché questa resterebbe in attesa di dati dal file prova_1/coda, come se fosse un file normale, per generare un file prova_2/coda (di tipo normale), con tale contenuto.

182.1.6   Utilizzo di «ln»

Il programma di servizio ln(2) (link) crea un collegamento tra file o tra directory:

ln [opzioni] origine destinazione
ln [opzioni] origine... directory

Se viene specificata un'origine e una destinazione, questa ultima diventa il nuovo collegamento che punta al nome indicato come origine (e può trattarsi anche di una directory). Se vengono specificati più nomi nell'origine, l'ultimo argomento deve essere una directory e si intende che al suo interno devono essere creati tanti collegamenti quanti sono i nomi indicati come origine. Se non viene specificato diversamente attraverso le opzioni, vengono creati dei collegamenti fisici e non dei collegamenti simbolici.

Il programma ln utilizza le variabili di ambiente VERSION_CONTROL e SIMPLE_BACKUP_SUFFIX nello stesso modo di cp.

Tabella 182.14. Alcune opzioni della versione GNU di ln. Le opzioni conformi allo standard POSIX sono evidenziate.

Opzione Descrizione
-b
--backup
-f
--force
-i
--interactive
-S
--suffix
-V
--version-control
Queste opzioni funzionano nello stesso modo di cp.
-s
--symbolic-link
Crea un collegamento simbolico invece di creare un collegamento fisico.
-d
-F
--directory
Permette all'utente root di creare un collegamento fisico per una directory, ma questa operazione potrebbe essere impedita poi dal kernel.
-n
--no-dereference
Quando la destinazione corrisponde a un collegamento simbolico preesistente che punta verso una directory, il funzionamento normale prevederebbe la creazione del collegamento in quella directory. Usando questa opzione si intende evitare ciò, rimpiazzando quel collegamento simbolico. Per poter attuare in pratica la cosa, occorre anche utilizzare l'opzione -f.

Segue la descrizione di alcuni esempi.

182.1.7   Utilizzo di «install»

Il programma di servizio install(3) copia i file attribuendo i permessi e le proprietà stabilite:

install [opzioni] origine... destinazione
install [opzioni] -d directory...

In pratica, si comporta in modo simile a cp con in più la possibilità di definire gli attributi dopo la copia e di creare tutte le directory necessarie. È usato tipicamente per l'installazione di programmi.

Tabella 182.15. Alcune opzioni di install nella versione GNU. Benché si tratti di un programma di uso comune, non fa parte dello standard POSIX.

Opzione Descrizione
-b
--backup
-S
--suffix
-V
--version-control
Queste opzioni funzionano nello stesso modo di cp.
-d directory...
--directory=directory...
Crea le directory indicate, definisce l'utente proprietario, il gruppo proprietario e i permessi in base alle altre opzioni.
-g gruppo
--group=gruppo
Definisce il gruppo proprietario dei file installati o delle directory.
-m modalità
--mode=modalità
Definisce i permessi in modo analogo alla sintassi di chmod (180.2.5).
-o proprietario
--owner=proprietario 
Definisce l'utente proprietario dei file installati o delle directory.

182.1.8   Utilizzo di «dd»

Il programma di servizio dd(4) (data duplicator o data dump) è un programma di copia a basso livello:

dd [opzioni] 

Le opzioni sono definite in modo strano rispetto ai normali programmi di servizio Unix, in quanto non sono prefissate dal solito trattino (-). Se tra le opzioni non vengono definiti i file di input o di output, si usano rispettivamente lo standard input e lo standard output.

Molte delle opzioni utilizzano un argomento numerico. Questi argomenti numerici possono essere indicati anche con l'ausilio di moltiplicatori posti subito dopo il numero stesso. La tabellina seguente riepiloga quelli di uso più comune nella versione GNU di dd; tenendo conto che sono disponibili altri moltiplicatori molto più grandi. I casi previsti anche dallo standard POSIX sono evidenziati:

Modello Valore corrispondente in byte Modello Valore corrispondente in byte
nc
n
nw
n * 2
nb
n * 512
nxm
n * m
nkB
n * 1 000
nk
nK
n * 1 024
nMB
n * 1 0002
nM
n * 1 0242
nGB
n * 1 0003
nG
n * 1 0243
nTB
n * 1 0004
nT
n * 1 0244

Tabella 182.17. Alcune opzioni, secondo lo standard POSIX

Opzione Descrizione
if=file
input file
Legge i dati dal file indicato invece che dallo standard input.
of=file
output file
Scrive i dati nel file indicato invece che attraverso lo standard output. In questo caso, se il file indicato esiste già e la quantità di dati da scrivere è inferiore alla sua vecchia dimensione, questo file viene troncato alla dimensione nuova. Questa regola non vale più se si utilizza un tipo di conversione notrunc (viene descritto più giù).
ibs=numero_di_byte
input block size
Legge a blocchi di byte della quantità indicata dall'argomento.
obs=numero_di_byte
output block size
Scrive a blocchi di byte della quantità indicata dall'argomento.
bs=numero_di_byte
block size
Legge e scrive a blocchi di byte della quantità indicata dall'argomento. Questa opzione annulla eventuali dichiarazioni fatte attraverso ibs e obs.
cbs=numero_di_byte
conversion block size
Definisce la dimensione della memoria di conversione (buffer). In pratica determina la dimensione del blocco da utilizzare quando si devono effettuare delle conversioni nella codifica. Più avanti viene mostrato il significato di questa opzione, in corrispondenza della descrizione dei tipi di conversione attuabili.
skip=numero_di_blocchi
In fase di lettura del file di input, salta il numero di blocchi indicato come argomento, dall'inizio del file, prima di iniziare la copia. I blocchi in questione corrispondono a quanto definito con ibs o con bs.
seek=numero_di_blocchi
In fase di scrittura del file di output, salta il numero di blocchi indicato come argomento prima di iniziare la copia. I blocchi in questione corrispondono a quanto definito con obs o con bs. Il risultato dell'azione di saltare dei blocchi in fase di scrittura cambia a seconda che il file di destinazione sia già esistente o meno. Se il file esiste già, i byte dei blocchi saltati vengono lasciati inalterati e nel file si comincia a scrivere dopo la posizione indicata: se poi il file è troppo corto, questo viene allungato. Se il file non esiste, i byte dei blocchi da saltare vengono scritti con un valore nullo (<NUL>, pari a 0016).
count=numero_di_blocchi
Determina la quantità di blocchi da scrivere: si tratta di blocchi di input e quindi di quelli definiti attraverso l'opzione ibs o bs. Senza l'indicazione di questa opzione, la copia è sempre completa (a meno che si saltino delle porzioni con l'opzione skip).
conv=conversione[,conversione]...
Permette di definire il tipo di conversione, anche attraverso passaggi successivi. Il tipo di conversione viene specificato con il nome che lo identifica. Se si intendono applicare passaggi successivi, i tipi di conversione si separano con una virgola senza spazi prima o dopo la stessa.

Tabella 182.18. Tipi di conversione conformi allo standard POSIX.

Tipo Descrizione
ascii
Converte dalla codifica EBCDIC a ASCII.
ebcdic
Converte dalla codifica ASCII a EBCDIC.
ibm
Converte dalla codifica ASCII-IBM a EBCDIC.
block
Tratta le righe di ingresso come record terminati dal codice di interruzione di riga. Questi record vengono troncati o allungati in modo da corrispondere alla dimensione indicata attraverso l'opzione cbs. Alla fine, i codici di interruzione di riga risultano trasformati in spazi normali (<SP>), a meno che i record non siano stati troncati prima; inoltre, se si è reso necessario un allungamento dei record, è sempre il carattere spazio a essere aggiunto.
In pratica, il risultato finale è quello di un file con i record di dimensione uguale e per questo senza più alcuna terminazione attraverso codici di interruzione di riga.
unblock
Esegue l'operazione opposta di block: il file in ingresso viene letto a blocchi di dimensione stabilita attraverso l'opzione cbs e gli spazi finali di ogni blocco vengono sostituiti con il codice di interruzione di riga.
lcase
Trasforma le lettere maiuscole in minuscole.
ucase
Trasforma le lettere minuscole in maiuscole.
swab
Scambia le coppie di byte: ciò può essere utile quando i dati in questione sono interi a 16 bit da trasformare in, o da, una piattaforma Intel. (Nelle piattaforme Intel, gli interi a 16 bit sono scritti in modo da invertire la sequenza normale dei due byte che si utilizzano).
noerror
Nel caso si verifichi un errore di lettura, continua ugualmente l'operazione.
notrunc
Il file in uscita non viene troncato. Questo argomento è utile nel caso si scriva su file già esistenti: se dopo la trasformazione che si fa, la dimensione dei dati in uscita è inferiore a quella che ha già il file su cui si scrive, i dati rimanenti si lasciano come sono senza ridurre la dimensione di questo file.
sync
Aggiusta la lunghezza di ogni blocco in ingresso, aggiungendo eventualmente il carattere <NUL> (0016), in modo che la sua dimensione sia uguale a quanto stabilito attraverso l'opzione ibs.

Il programma dd viene usato normalmente per riprodurre le immagini di dischetti, anche se nella maggior parte dei casi, con un sistema GNU/Linux è sufficiente usare cp. A questo proposito, vengono mostrati alcuni esempi.

182.1.9   Utilizzo di «ddrescue»

Il programma di servizio ddrescue(5) è analogo a dd, con la differenza fondamentale che la copia non si arresta in presenza di errori di lettura, pertanto viene usato principalmente per il recupero dei dati da unità di memorizzazione difettose:

ddrescue [opzioni] file_in_ingresso file_in_uscita [registro]

La sintassi per l'uso di questo programma è diversa rispetto al dd tradizionale, in quanto utilizza opzioni precedute da trattini, come avviene di solito, inoltre prevede la possibilità di associare un file per annotare l'esito del processo di recupero dati (l'ultimo nome opzionale che appare nella riga di comando).

Tabella 182.19. Alcune opzioni per l'uso di ddrescue.

Opzione Descrizione
-b n_byte
--block-size=n_byte
Dichiara la dimensione dei blocchi da usare in fase di lettura. In valore predefinito è di 512 byte per le unità a disco normali e 2 048 byte per CD/DVD.
-c n
--cluster-size=n
Richiede la lettura simultanea di n blocchi (n volte la dimensione del blocco stabilita con l'opzione -b). Per esempio, per la lettura di dischetti convengono blocchi da 18 unità, in quanto un dischetto comune è composto da tracce da 18 settori (i settori, in questo caso, sono da 512 byte). Il valore predefinito di questi blocchi di lettura è complessivamente di 64 Kibyte, ovvero 64 Kibyte diviso il valore specificato con l'opzione -b.
-i n
--input-position=n
Richiede di iniziare la lettura a partire dal byte n; se non viene specificato, si intende che l'inizio debba avvenire dalla posizione zero.
-o n
--output-position=n
Richiede di iniziare la scrittura a partire dal byte n nel file di destinazione; se non viene specificato, si intende lo stesso valore dell'opzione -i.
-r n
--max-retries=n
Richiede di ritentare n volte (oltre la prima lettura), se si presenta un errore. Il valore predefinito per questa opzione è zero, nel senso che si tenta una sola lettura; se si usa il valore -1, si intende richiedere una quantità infinita di tentativi.

Gli argomenti delle opzioni che rappresentano una quantità di byte, come nel caso di -c, -i e -o, consentono l'uso di suffissi che moltiplicano il valore numerico rappresentato per un valore costante dato, in un modo simile a quello che avviene per il programma dd; tuttavia, le sigle usate non sono sempre compatibili.

Tabella 182.20. Rappresentazione di valori numerici che esprimono una quantità di byte, con l'ausilio di moltiplicatori, nelle opzioni di ddrescue (nella versione GNU). Sono disponibili anche altri moltiplicatori, per valori molto più grandi.

Modello Valore corrispondente in byte Modello Valore corrispondente in byte
nb
n blocchi fisici, in base alle caratteristiche dell'unità di memorizzazione.
nk
n * 1 000
nKi
n * 1 024
nM
n * 1 0002
nMi
n * 1 0242
nG
n * 1 0003
nGi
n * 1 0243
nT
n * 1 0004
nTi
n * 1 0244

Segue la descrizione di alcuni esempi.

Quando si dispone di dischi identici (per esempio CD/DVD-ROM) che risultano danneggiati in modo differente, è possibile riavviare il procedimento di recupero facendo riferimento allo stesso file di destinazione e lo stesso file per le annotazioni. Il programma ddrescue, nei tentativi successivi, si occupa di leggere solo le porzioni di dati che in quelli precedenti non hanno prodotto un risultato soddisfacente.

Quando si vuole recuperare il contenuto di una partizione di un'unità di memorizzazione comune, occorre tenere presente che questa non deve essere innestata, o almeno occorre avere l'accortezza di utilizzarla in sola lettura. Dopo il recupero in un file-immagine, si procede normalmente con programmi come fsck per cercare di sistemare in qualche modo il file-immagine stesso, prima di riutilizzarlo.

182.2   Spostamento e cancellazione

Lo spostamento è una sorta di copia e cancellazione dell'originale. Attraverso questo meccanismo si ottiene anche il cambiamento del nome di file e directory: un cambiamento di nome puro e semplice non è possibile. Questo fatto deve essere considerato quando si valutano le conseguenze dei permessi attribuiti ai file e alle directory; inoltre, occorre tenere in considerazione il problema quando si valuta l'eventuale pericolosità di questo tipo di operazione: cambiare nome a un file in modo errato può provocare la sovrascrittura di un altro.

La cancellazione è sempre l'operazione più pericolosa. Nei file system Ext2 o Ext3 non è molto facile recuperare i dati cancellati. Piuttosto di cancellare, sarebbe meno pericoloso spostare temporaneamente i file in una directory che funge da cestino. Nella sezione 182.2.3 viene mostrato uno script in grado di gestire agevolmente una sorta di cestino del genere.

La cancellazione si ottiene normalmente eliminando la voce relativa all'interno di una directory e liberando l'inode corrispondente, mentre l'informazione rimane presente fino a quando lo stesso spazio viene riutilizzato nel disco. Quando si devono cancellare anche le tracce residue di un'informazione, occorre usare strumenti appositi che, prima di cancellare un file, lo sovrascrivono varie volte con dati più o meno casuali. Tuttavia, questa tecnica non funziona se la memoria di massa è organizzata in modo diverso dal solito per qualche fine, come può essere un sistema ridondante, un sistema che mantiene lo storico di tutti i cambiamenti apportati al file system o un sistema che si avvale della rete per la condivisione degli stessi dati.

182.2.1   Utilizzo di «mv»

Il programma di servizio mv(6) (move) sposta i file o le directory:

mv [opzioni] origine... destinazione

Se vengono specificati solo i nomi di due elementi (file o directory), il primo viene spostato o rinominato in modo da ottenere quanto indicato come destinazione. Se vengono indicati più elementi (file o directory), l'ultimo argomento deve essere una directory, all'interno della quale vengono spostati tutti gli elementi elencati. Nel caso di spostamenti attraverso diversi file system, vengono spostati solo i file normali, quindi: né collegamenti, né directory.

Il programma mv può essere pericoloso perché può sovrascrivere altri file senza preavviso. Per ridurre le possibilità di errori, conviene creare un alias in modo che mv funzioni sempre con l'opzione -i. Se poi si ha la necessità di sovrascrivere i file di destinazione, si può sempre utilizzare l'opzione -f.

Tabella 182.21. Alcune opzioni di mv, nella versione GNU. Le opzioni conformi allo standard POSIX sono evidenziate.

Opzione Descrizione
-b
--backup
-f
--force
-i
--interactive
-S
--suffix
-V
--version-control
Queste opzioni funzionano nello stesso modo di cp.

182.2.2   Utilizzo di «rm»

Il programma di servizio rm(7) (remove) rimuove i file indicati come argomento:

rm [opzioni] nome...

In mancanza dell'indicazione delle opzioni necessarie, non vengono rimosse le directory.

Tabella 182.22. Alcune opzioni di rm, nella versione GNU. Le opzioni conformi allo standard POSIX sono evidenziate.

Opzione Descrizione
-r
-R
--recursive
Rimuove il contenuto delle directory in modo ricorsivo.
-i
--interactive
Chiede una conferma esplicita per la cancellazione di ogni file.
-d
--directory
Elimina le directory trattandole come se fossero dei file normali. In pratica, i file e le altre directory che dovessero eventualmente essere contenuti, non vengono rimossi prima: viene semplicemente interrotto il loro collegamento. L'operazione può essere pericolosa perché ci potrebbero essere dei file aperti al di sotto di queste directory che si rimuovono, senza che tale possibilità venga verificata. Inoltre, dopo un'azione di questo tipo, il file system deve essere controllato in modo da eliminare gli errori che si generano: la presenza di file senza riferimenti è un errore.
-f
--force
Ignora l'eventuale assenza di file per i quali si richiede la cancellazione e non chiede conferme all'utente. Può essere utile quando si prepara uno script e non è importante se ciò che si cancella esiste già o meno.

Segue la descrizione di alcuni esempi.

Il programma rm è pericolosissimo perché è potente e irreversibile. Gli errori più frequenti e disastrosi, sono causati da sbagli nella digitazione dei comandi o da cattiva valutazione dell'effetto di uno di questi. Ci sono tre cose da fare per ridurre i rischi di disastri:

  • evitare il più possibile di accedere come utente root;

  • controllare il comando che si vuole eseguire;

  • creare un alias in modo che rm funzioni sempre con l'opzione -i.

Gli errori più frequenti da evitare sono descritti negli esempi seguenti.

182.2.3   Cestino personale

Il modo migliore per non sbagliare utilizzando rm è quello di non usarlo. Quello che segue è un esempio di uno script che invece di cancellare sposta i file e le directory in una sorta di cestino:

#!/bin/sh
##
## ricicla FILE...
##
#
# nome_completo NAME
#
function nome_completo () {
    #
    local primo_carattere
    local comando_sed
    comando_sed="sed -n s/^\\(.\\).*/\\1/p"
    #
    primo_carattere=`echo $1 | $comando_sed`
    #
    if [ $primo_carattere == "/" ]
    then
        #
        # Si tratta di un percorso assoluto.
        #
        echo $1
    else
        #
        # È necessario aggiungere il percorso precedente.
        #
        echo `pwd`/$1
    fi
}
#
# Crea una directory temporanea da usare come cestino.
#
CESTINO="/var/tmp/cestino"
DATA=$(date +%Y%m%d%H%M%S)
NOME_COMPLETO=""
#
mkdir $CESTINO 2> /dev/null
#
# Verifica.
#
if ! touch $CESTINO/$DATA
then
    #
    # Non è stato possibile creare il cestino: forse ci sono
    # problemi di permessi.
    #
    echo "Non è possibile accedere alla directory"
    echo "$CESTINO"
    #
    # Lo script termina restituendo un valore falso.
    #
    exit 1
else
    #
    # Elimina il file di prova all'interno del cestino.
    #
    rm -f $CESTINO/$DATA
fi
#
# Copia all'interno del cestino.
#
for filename in $@
do
    #
    # Trova il percorso assoluto.
    #
    NOME_COMPLETO=`nome_completo $filename`
    #
    # Sposta il file o la directory.
    #
    if cp -dpRfv --parents $NOME_COMPLETO $CESTINO
    then
        rm -rf $NOME_COMPLETO
    fi
done

L'esempio mostrato riproduce il percorso in cui si trovano i file a partire dalla directory che svolge il ruolo di cestino. In questo modo si possono creare delle collisioni, per esempio quando si tenta di sovrascrivere una directory con un file. Se si preferisce si può usare la versione alternativa che viene mostrata nel seguito, in cui l'inizio del percorso del cestino è ottenuto da una sottodirectory composta dalla data e dall'ora in cui è stata svolta l'operazione:

#!/bin/sh
##
## ricicla FILE...
##
#
# nome_completo NAME
#
function nome_completo () {
    #
    local primo_carattere
    local comando_sed
    comando_sed="sed -n s/^\\(.\\).*/\\1/p"
    #
    primo_carattere=`echo $1 | $comando_sed`
    #
    if [ $primo_carattere == "/" ]
    then
        #
        # Si tratta di un percorso assoluto.
        #
        echo $1
    else
        #
        # È necessario aggiungere il percorso precedente.
        #
        echo `pwd`/$1
    fi
}
#
# Crea una directory temporanea da usare come cestino.
#
CESTINO="/var/tmp/cestino"
DATA=$(date +%Y%m%d%H%M%S)
NOME_COMPLETO=""
#
mkdir $CESTINO 2> /dev/null
#
# Verifica.
#
if ! touch $CESTINO/$DATA
then
    #
    # Non è stato possibile creare il cestino: forse ci sono
    # problemi di permessi.
    #
    echo "Non è possibile accedere alla directory"
    echo "$CESTINO"
    #
    # Lo script termina restituendo un valore falso.
    #
    exit 1
else
    #
    # Elimina il file di prova all'interno del cestino.
    #
    rm -f $CESTINO/$DATA
fi
#
# Fa in modo che il cestino abbia una sottodirectory diversa ogni volta.
#
CESTINO="$CESTINO/$DATA"
mkdir $CESTINO 2> /dev/null
#
# Copia all'interno del cestino.
#
for filename in $@
do
    #
    # Trova il percorso assoluto.
    #
    NOME_COMPLETO=`nome_completo $filename`
    #
    # Sposta il file o la directory.
    #
    if cp -dpRfv --parents $NOME_COMPLETO $CESTINO
    then
        rm -rf $NOME_COMPLETO
    fi
done

182.2.4   Utilizzo di «unlink»

Il programma di servizio unlink(8) è probabilmente qualcosa di superfluo, ma esiste nei sistemi Unix, pertanto è incluso anche nei sistemi GNU. Il suo scopo è quello di cancellare il riferimento a un file, cosa che equivale alla cancellazione; tuttavia, in alcuni sistemi, questo programma può anche cancellare il riferimento a una directory, cosa che però non corrisponde alla cancellazione del suo contenuto, che così continua a esistere come inode, anche se può essere irraggiungibile attraverso un percorso. Per motivi di sicurezza, nei sistemi GNU, unlink non può essere usato con le directory.

unlink file...

182.2.5   Utilizzo di «shred»

Il programma di servizio shred(9) serve a cancellare il contenuto di un file, in modo da renderne impossibile il recupero. Il programma shred esegue questo compito sovrascrivendo più volte i dati del file, con dati più o meno casuali:

shred [file] file...

In condizioni normali, quando non si specifica qualcosa di diverso attraverso le opzioni, il file viene sovrascritto fino alla fine dell'ultimo blocco che lo contiene. Per blocco si intende l'unità minima di dati in base al contesto, che può essere il blocco del file system o il blocco dell'unità a blocchi, se si fa riferimento a file di dispositivo il cui accesso è regolato in questo modo.

Dal momento che si può indicare un file su disco o un file di dispositivo, il programma non cancella il file alla fine della sovrascrittura, a meno che sia richiesto espressamente con le opzioni.

Per approfondire l'uso del programma, si può consultare la documentazione originale: info shred oppure la pagina di manuale shred(1). Si ricordi anche di verificare se, in base al proprio contesto operativo, l'uso del programma può produrre effettivamente il risultato atteso.

182.3   Altri programmi affini


1) GNU core utilities   GNU GPL

2) GNU core utilities   GNU GPL

3) GNU core utilities   GNU GPL

4) GNU core utilities   GNU GPL

5) GNU ddrescue   GNU GPL

6) GNU core utilities   GNU GPL

7) GNU core utilities   GNU GPL

8) GNU core utilities   GNU GPL

9) GNU core utilities   GNU GPL

10) sdd   GNU GPL

11) cstream   software libero con licenza speciale


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


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

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

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory