Lavorare con i file

Vediamo alcune semplici e utilissime operazioni sui file che è possibile fare dalla riga di comando.

Copiare un file in un altro file

Per copiare un file si utilizza il comando cp che ha la seguente sintassi:

cp [-ip] file1 file2

Questo comando ha l'effetto di copiare il contenuto del file sorgente file1 nel file destinazione file2. Fra parentesi quadre sono indicate due possibili opzioni.

Si supponga ad esempio di voler copiare il file dati1.txt nel file dati2.txt. Ecco come fare:

cp dati1.txt dati2.txt

Se i due file non si trovano nella directory di lavoro, sarà necessario indicare tutto il pathname:

cp /etc/dati1.txt ~/dati2.txt

Abbiamo così copiato il file dati1.txt, contenuto nella directory /etc, nel file dati2.txt nella directory home dell'utente (~ è un'abbreviazione per la home directory). Se il file di destinazione dati2.txt non esiste, verrà creato; se esiste già verrà sostituito (tutti i dati precedentemente memorizzati andranno persi).

Con l'opzione -i (interactive), il comando cp chiede all'utente il permesso di fare la copia nel caso il file di destinazione esista già. L'opzione -p preserva nel file destinazione gli stessi permessi e tempi di modifica del file sorgente.

Copiare un file in un'altra directory

Possiamo usare cp anche per copiare uno o più file in una directory diversa da quella nella quale si trovano:

cp [-ip] file... directory

Ecco un esempio pratico. Il seguente comando copia il file dati.txt dalla directory di lavoro nella sua sotto-directory documenti:

cp dati.txt documenti

Possiamo anche copiare più file con lo stesso comando:

cp dati1.txt dati2.txt dati3.txt dati4.txt documenti

In questo modo, i file dati1.txt, dati2.txt, dati3.txt e dati4.txt sono stati copiati nella directory documenti.

Spostare un file in un'altra directory

Se vogliamo spostare uno o più file da una directory ad un'altra, il comando da usare è mv (move):

mv [-if] file... directory

Nel seguente esempio, i file data1 e data1 vengono spostati dalla directory di lavoro alla sua sotto-directory documenti:

mv data1 data2 documenti

Utilizzando pathname assoluti possiamo spostare file da qualunque directory a qualunque altra directory di destinazione:

mv /etc/data /usr/share

Attenzione: cosa succede se nella directory di destinazione già esiste un file con lo stesso nome del file che stiamo spostando? Ad esempio, consideriamo l'ultimo esempio (mv /etc/data /usr/share) e supponiamo che in /urs/share ci sia già un file data. In tal caso, il comando mv sostituirà il file originale con il nuovo file, e tutto il contenuto del file preesistente andranno persi. Perciò bisogna usare molta attenzione con il comando mv.

Per non rischiare la perdita dei dati possiamo usare, anche qui, il comando in modalità interattiva con l'opzione -i:

mv -i /etc/data /usr/share

In tal modo, se esite già un file /usr/share/data, il comando mv si comporterà come segue:

rossi@saturno:~$ mv -i /etc/data /usr/share
mv: overwrite '/usr/share/data'?

se rispondiamo affermativamente (y) il file verrà sostituito, altrimenti il comando non avrà alcun effetto.

L'opzione -f (force) va usata con molta cautela, perché annulla tutte le restrizioni sui file (compresa quella derivante da -i) e forza mv ad eseguire lo spostamento in ogni caso.

Ridenominare un file o una directory

Il comando mv può essere usato anche per ridenominare un file o una directory. La sintassi è la stessa: come file sorgente diamo il vecchio nome del file o directory (esistente), mentre come file destinazione usiamo il nuovo nome che vogliamo dare al file o directory. Ad esempio, supponiamo di voler cambiare il nome ad un file che si trova nella directory di lavoro. Se il file si chiama info e vogliamo cambiargli il nome in dati, il comando sarà il seguente:

mv info dati

Bisogna stare solo attenti a non sovrascrivere un file già esistente: se c'è già un file dati il suo contenuto andrà perduto per sempre e sostituito da quello del nuovo file. Possiamo però sempre usare le opzioni -i e -f. Sarà anche possibile spostare e ridenominare un file con un solo comando:

mv info documenti/dati

In questo modo abbiamo spostato il file info dalla directory di lavoro alla sua sotto-directory documenti e lo abbiamo ridenominato dati.

Rimuovere un file

Se vogliamo rimuovere un file, il comando che ci serve è rm che ha la seguente sintassi:

rm [-fir] file...

Per rimuovere un file che si trova nella directory di lavoro dobbiamo solo specificare il suo nome:

rm info

Se il file si trova in una direcory diversa da quella di lavoro, specificheremo la sua posizione nel pathname:

rm documenti/info

In questo caso il file si trova nella sotto-directory documenti. Sa il file non è in una sottodirectory della directory di lavoro, allora dobbiamo specificare tutto il percorso per raggiungere il file da rimuovere (ovviamente questo vale per tutti i comandi sui file). Per esempio, se la directory di lavoro è /home/rossi/documenti e il file da cancellare si trova nella directory /home/rossi/musica/spartiti, daremo il comando:

rm /home/rossi/musica/spartiti/info

O alternativamente:

rm ../musica/spartiti/info

Con .. ci siamo spostati di un livello in alto sull'albero del file system, cioè dalla directory /home/rossi/domumenti alla sua directory genitore /home/rossi. Da qui siamo poi scesi in musica/spartiti.

Per evitare di rimuovere il file sbagliato, ci viene incontro l'opzione -i che farà in modo che rm ci chieda una conferma prima di rimuovere qualsiasi file. L'opzione -f forza il comando ad eseguire la cancellazione del file in qualsiasi situazione e senza chiedere conferma (va usato solo quando sappiamo quello che facciamo...).

L'opzione -r (recursive) ci consente di rimuovere un intero sottoalbero (con tutti i file e le sue sotto-directory). Ad esempio, supponiamo di avere una directory appunti. Il seguente comando cancella la directory con tutti i file e tutte le directory in essa contenute:

rm -r appunti

Aggiungendo l'opzione -i si fa in modo che ci venga chiesto il permesso prima di rimuovere un qualunque file o directory del sottoalbero della directory appunti:

rossi@saturno:~$ rm -ir appunti
rm: descend into directory 'appunti'? y
rm: remove directory 'appunti/geografia'? y
rm: remove regular file 'appunti/generale.txt'? y
rm: remove directory 'appunti/storia'? y
rm: remove directory 'appunti'? y