Comandi: tar

Comandi: tar

Il comando tar deve il suo nome non al catrame (tar in inglese vuol dire catrame) come in molti credono, bensì alla due parole "tape" e "archive", e infatti originariamente è nato per archiviare dati su nastro magnetico, ed ancor oggi, sebbene sia utilizzato sempre più di rado per scrivere su tali supporti, conserva alcune caratteristiche peculiari dovute alla funzionalità originaria.

La prima di queste caratteristiche è che se lo lanciamo senza specificare un file di uscita con lo switch -f, tar tenta di scrivere su nastro magnetico, o almeno sul device che secondo il default del sistema è il nastro mangetico. Ad esempio su FreeBSD cerca di scrivere sul device /dev/sa0. Su Linux di solito il device su cui cerca di scrivere è lo standard output. In ogni caso un errore classico quando si usa per le prime volte tar, è quello di scordarsi di specificare il file di uscita con il parametro -f. Un altro errore piuttosto comune è quello di scordarsi di specificare quale operazione vogliamo eseguire, cioè se vogliamo creare un nuovo archivio inserendoci dentro dei file (opzione c), estrarre dei file da un archivio esistente (opzione x), oppure elencare i file contenuti in un archivio (opzione t). In generale quindi diciamo che la sintassi di base di tar è così composta:

tar <operazione> -f <destinazione> [files....]

Creare un file tar

Usando la sintassi sopra, e ricordando che l'operazione per creare un file tar è c, possiamo creare un archivio come nell'esempio seguente:

$ tar c -f archivio.tar file1.txt file2.txt file3.txt 
$ ls -l
-rw-rw-r--  1 maurizio maurizio 10240 ott  7 10:59 archivio.tar
-rw-rw-r--  1 maurizio maurizio    21 ago 10 02:43 file1.txt
-rw-rw-r--  1 maurizio maurizio   229 gen  5  2018 file2.txt
-rw-rw-r--  1 maurizio maurizio    84 lug 31 13:35 file3.txt

Come si vede i file originali sono ancora al loro posto, ma è stato creato il nuovo file archivio.tar che conterrà una copia archiviata dei file file1.txt, file2.txt e file3.txt. Naturalmente avrei potuto anche utilizzare un carattere jolly per specificare quali file includere nell'archivio, ad esempio:

$ tar c -f archivio.tar *.txt

Oltre ai file tar può essere usato per archiviare intere directory con tutto il loro contenuto. Se nell'elenco dei file da archiviare specificati sulla linea di comando c'è una directory, questa viene percorsa e il suo contenuto, comprese eventiali sottodirectory, viene copiato nel file tar. Questa funzionalità è ovviamente molto comda per fare i backup (funzione per la quale tar è nato!). Ad esempio posso creare facilmente un backup della configurazione del mio laptop con:

sudo tar c -f backup-etc.tar /etc

In questo caso ho dovuto usare sudo perché alcuni file in /etc sono accessibili solo all'utente root.

Elencare i contenuti di un file tar

Per vedere cosa contiene un file tar si usa l'operazione t:

$ tar t -f archivio.tar 
file1.txt
file2.txt
file3.txt

Se volessi vedere più dettagli sul contenuto di un archivio potre usare lo switch v:

$ tar t -vf archivio.tar 
-rw-rw-r-- maurizio/maurizio 21 2018-08-10 02:43 file1.txt
-rw-rw-r-- maurizio/maurizio 229 2018-01-05 12:58 file2.txt
-rw-rw-r-- maurizio/maurizio  84 2018-07-31 13:35 file3.txt

Come si può vedere tar immagazzina i file portandosi dietro anche i loro attributi come ad esempio i permessi di lettura/scrittura/esecuzione, il prorietario e il gruppo proprietario, quanto spazio in bytes occupa il file, la data di modifica del file ed infine il nome.

I file nell'archivio sono sempre immagazzinati con il loro nome comprensivo di path. Ad esempio, se creo una directory mieifiles contenente alcuni files, e ne archivio il contenuto, ottengo:

$ tar c -f archivio.tar mieifiles
$ tar t -f archivio.tar 
mieifiles/
mieifiles/test.txt
mieifiles/test1.txt
mieifiles/text.txt

In pratica dentro all'archivio tar viene creata l'intera alberatura delle directory che contengono i files archiviati. Questo consente di creare backup consistenti in modo molto semplice anche di strutture complesse.

Estrarre i file da un archivio tar

Per estrarre i file da un archivio tar basta usare il comando x: Ad esempio:

$ tar x -f archivio.tar

estrae tutti i contenuti dell'archivio.

Attenzione: normalmente l'estrazione sovrascrive eventuali file esistenti!

Se non si verificano errori tar non da alcun messaggio sia nella creazione dell'archivio, sia quando si estraggono i file. Se si vuole vedere la lista di quello che viene inserito nel file .tar o che viene estratto basta usare lo switch v:

$ tar x -vf archivio.tar  
file1.txt
file2.txt
file3.txt

Se necessario posso anche selezionare quali files voglio estrarre, ad esempio posso estrarre solo il file file3.txt:

$ tar x -vf archivio.tar file3.txt
file3.txt

Nel caso in cui abbia archiviato delle directory per estrarre uno specifico file, o una specifica directory, dovrò specificare sulla riga di comando il percorso del file da estrarre. Esempio:

$ tar c -f archivio.tar mieifiles
$ tar t -f archivio.tar 
mieifiles/
mieifiles/test.txt
mieifiles/test1.txt
mieifiles/text.txt
$ tar x -vf archivio.tar mieifiles/test1.txt 
mieifiles/test1.txt

Attenzione: il path che devo specificare sulla riga di comando per l'estrazione è quello interno al file tar, non quello dove si trovava il file all'origine. Non è difficile da ritrovare, basta usare il comando t per visualizzare i contenuti dell'archivio, come ho fatto nell'esempio sopra.

Per default i file vengono estratti nella directory corrente dove vengono ricreati i path completi memorizzati nell'archivio, cioè se il file archiviato si chiamava "miefiles/test2.txt" e vado ad estrarlo, nella directory corrente verrà creata una directory "mieifiles" contenente il file test2.txt". Si può però forzare l'estrazione altrove usando lo switch -C (attenzione, è una C maiuscola). Ad esempio il comando:

$ tar x -f archivio.tar  -C /tmp

estrae il contenuto dell'archivio nella directory /tmp.

Lo switch -C si può usare anche con il comando compressione, vediamo come ad esempio posso creare un archivio contenente la copia della configurazione del mio laptop Linux anche se la cartella corrente è la mia home directory:

~/ $ tar c -f myconfig.tar -C / etc/hosts

Una cosa importante da ricordare è che tar archivia sempre i nomi dei file come se fossero relativi, quindi elimina eventuali riferimenti alla root. Se infatti provo ad archiviare un file o una directory usando un percorso assoluto, tar mi avvisa che i nomi dei file saranno memorizzati nell'archivio senza lo / iniziale.

$ tar c -f archivio.tar  /etc/localtime
tar: Rimozione di "/" iniziale dai nomi dei membri

tar e compressione

Quando andiamo ad archiviare qualcosa spesso è perché vogliamo immagazzinarlo come backup oppure trasmetterlo via rete, e quindi vogliamo che l'archivio occupi meno spazio possibile. Per questo il comando tar ci offre lo switch z che consente di creare "al volo" file tar compressi con gzip.

$ tar c -zf archivio.tgz file.txt 

Per estrarre i file da questo archivio devo ricordarmi di usare lo switch z:

$ tar x -zf archivio.tgz

Convenzionalmente ai file tar compressi si assegna l'estensione .tgz per distinguerli dai file tar non compressi. Dato che la compressione utilizzata è quella di gzip, per aprire un file .tgz posso anche usare prima gunzip e poi tar senza opzione z.

Approfondimenti

In questo post abbiamo visto i comandi fondamentali di tar e il suo uso "standard", esistono però tantissimi switch utili per modificare il suo comportamento e attivare funzionalità che possono essere utili. Per saperne di più vi invito, come al solito, ad usare il man:

man tar

Currently there are no comments, so be the first!