<Precedenti | Contenuti | Succ.>
tar
Nel mondo del software simile a Unix, il tar programma è il classico strumento per l'archiviazione dei file.
Il suo nome, abbreviazione di archivio su nastro, rivela le sue radici come strumento per creare nastri di backup. Sebbene sia ancora utilizzato per quell'attività tradizionale, è ugualmente abile anche su altri dispositivi di archiviazione. Vediamo spesso nomi di file che terminano con l'estensione .catrame or .tgz, che indicano rispettivamente un archivio tar "semplice" e un archivio gzippato. Un archivio tar può essere costituito da un gruppo di file separati, una o più gerarchie di directory o una combinazione di entrambi. La sintassi del comando funziona così:
tar modo[Opzioni] pathname...
where modo è una delle seguenti modalità di funzionamento (qui viene mostrato solo un elenco parziale; vedere il tar pagina man per un elenco completo):
Tabella 18-2: Modalità tar
Descrizione modalità
Descrizione modalità
c Creare un archivio da un elenco di file e/o directory.
x Estrarre un archivio.
r Aggiunge percorsi specificati alla fine di un archivio.
t Elenca il contenuto di un archivio.
tar usa un modo un po' strano di esprimere le opzioni, quindi avremo bisogno di alcuni esempi per mostrare come funziona. Per prima cosa, ricreiamo il nostro playground dal capitolo precedente:
[io@linuxbox~]$ mkdir -p parco giochi/dir-{001..100}
[io@linuxbox~]$ tocca playground/dir-{001..100}/file-{A..Z}
[io@linuxbox~]$ mkdir -p parco giochi/dir-{001..100}
[io@linuxbox~]$ tocca playground/dir-{001..100}/file-{A..Z}
Quindi, creiamo un archivio tar dell'intero playground:
[io@linuxbox~]$ tar cf parco giochi.tar parco giochi
[io@linuxbox~]$ tar cf parco giochi.tar parco giochi
Questo comando crea un archivio tar chiamato parco giochi.tar che contiene l'intera gerarchia di directory del playground. Possiamo vedere che la modalità e il f opzione, che viene utilizzata per specificare il nome del tar archivio, possono essere uniti e non richiedono un trattino iniziale. Si noti, tuttavia, che la modalità deve essere sempre specificata per prima, prima di qualsiasi altra opzione.
Per elencare i contenuti dell'archivio, possiamo fare questo:
[io@linuxbox~]$ tar tf parco giochi.tar
[io@linuxbox~]$ tar tf parco giochi.tar
Per un elenco più dettagliato, possiamo aggiungere il v (verboso) opzione:
[io@linuxbox~]$ tar tvf parco giochi.tar
[io@linuxbox~]$ tar tvf parco giochi.tar
Ora estraiamo il playground in una nuova posizione. Lo faremo creando una nuova directory denominata foo, cambiando la directory ed estraendo l'archivio tar:
[io@linuxbox~]$ mkdir pippo
[io@linuxbox~]$ cd pippo
[me@linuxbox pippo]$ tar xf ../parco giochi.tar
[me@linuxbox pippo]$ ls
parco giochi
[io@linuxbox~]$ mkdir pippo
[io@linuxbox~]$ cd pippo
[me@linuxbox pippo]$ tar xf ../parco giochi.tar
[me@linuxbox pippo]$ ls
parco giochi
Se esaminiamo il contenuto di ~/pippo/parco giochi, vediamo che l'archivio è stato installato con successo, creando una riproduzione precisa dei file originali. C'è un avvertimento, tuttavia: a meno che tu non operi come superutente, i file e le directory estratti dagli archivi assumono la proprietà dell'utente che esegue il ripristino, piuttosto che il proprietario originale.
Un altro comportamento interessante di tar è il modo in cui gestisce i nomi di percorso negli archivi. L'impostazione predefinita per i nomi di percorso è relativa, piuttosto che assoluta. tar lo fa semplicemente rimuovendo qualsiasi barra iniziale dal nome del percorso durante la creazione dell'archivio. Per dimostrare, ricreeremo il nostro archivio, questa volta specificando un percorso assoluto:
[me@linuxbox pippo]$ cd
[io@linuxbox~]$ tar cf playground2.tar ~/parco giochi
[me@linuxbox pippo]$ cd
[io@linuxbox~]$ tar cf playground2.tar ~/parco giochi
Ricordate, ~/parco giochi si espanderà in /home/me/parco giochi quando premiamo il tasto Invio, otterremo un percorso assoluto per la nostra dimostrazione. Successivamente, estrarremo l'archivio come prima e osserveremo cosa succede:
[io@linuxbox~]$ cd pippo
[me@linuxbox pippo]$ tar xf ../parco giochi2.tar
[me@linuxbox pippo]$ ls
parco giochi casalingo [me@linuxbox foo]$ è casa
[io@linuxbox~]$ cd pippo
[me@linuxbox pippo]$ tar xf ../parco giochi2.tar
[me@linuxbox pippo]$ ls
parco giochi casalingo [me@linuxbox foo]$ è casa
me
[me@linuxbox pippo]$ è casa/io
parco giochi
me
[me@linuxbox pippo]$ è casa/io
parco giochi
Qui possiamo vedere che quando abbiamo estratto il nostro secondo archivio, ha ricreato la directory casa/io/parco giochi relativo alla nostra directory di lavoro corrente, ~/pippo, non relativo alla directory principale, come sarebbe stato il caso con un percorso assoluto. Può sembrare un modo strano per farlo funzionare, ma in realtà è più utile in questo modo, poiché ci consente di estrarre gli archivi in qualsiasi posizione piuttosto che essere costretti a estrarli nelle posizioni originali. Ripetendo l'esercizio con l'inclusione dell'opzione verbose (v) fornirà un'immagine più chiara di ciò che sta accadendo.
Consideriamo un esempio ipotetico, ma pratico, di tar in azione. Immagina di voler copiare la directory home e il suo contenuto da un sistema a un altro e di avere un grande disco rigido USB che possiamo usare per il trasferimento. Sul nostro moderno sistema Linux, l'unità è montata "automagicamente" nel /metà directory. Immaginiamo anche che il disco abbia un nome di volume di BigDisk quando lo alleghiamo. Per creare l'archivio tar, possiamo fare quanto segue:
[io@linuxbox~]$ sudo tar cf /media/BigDisk/home.tar /home
[io@linuxbox~]$ sudo tar cf /media/BigDisk/home.tar /home
Dopo che il file tar è stato scritto, smontiamo l'unità e la colleghiamo al secondo computer. Ancora una volta, è montato a /media/BigDisk. Per estrarre l'archivio, facciamo questo:
[io@linuxbox2 ~]$ cd /
[io@linuxbox2 /]$ sudo tar xf /media/BigDisk/home.tar
[io@linuxbox2 ~]$ cd /
[io@linuxbox2 /]$ sudo tar xf /media/BigDisk/home.tar
Ciò che è importante vedere qui è che dobbiamo prima cambiare directory in /, in modo che l'estrazione sia relativa alla directory radice, poiché tutti i nomi di percorso all'interno dell'archivio sono relativi.
Quando si estrae un archivio, è possibile limitare ciò che viene estratto dall'archivio. Ad esempio, se volessimo estrarre un singolo file da un archivio, potremmo fare così:
catrame xf nome percorso archivio.tar
catrame xf nome percorso archivio.tar
Aggiungendo il finale pathname al comando, tar ripristinerà solo il file specificato. È possibile specificare più percorsi. Nota che il percorso deve essere la relazione completa ed esatta
nome del percorso come memorizzato nell'archivio. Quando si specificano i nomi di percorso, i caratteri jolly non sono normalmente supportati; tuttavia, la versione GNU di tar (che è la versione che si trova più spesso nelle distribuzioni Linux) li supporta con il --caratteri jolly opzione. Ecco un esempio usando il nostro precedente parco giochi.tar file:
[io@linuxbox~]$ cd pippo
[me@linuxbox pippo]$ tar xf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A'
[io@linuxbox~]$ cd pippo
[me@linuxbox pippo]$ tar xf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A'
Questo comando estrarrà solo i file che corrispondono al percorso specificato incluso il carattere jolly dir-*.
tar è spesso usato insieme a find per produrre archivi. In questo esempio, useremo find per produrre un insieme di file da includere in un archivio:
[io@linuxbox~]$ trova playground -name 'file-A' -exec tar rf playground.tar '{}' '+'
[io@linuxbox~]$ trova playground -name 'file-A' -exec tar rf playground.tar '{}' '+'
Qui usiamo Find per abbinare tutti i file in parco giochi detto file-A e poi, usando il Exec- azione, invochiamo tar in modalità append (r) per aggiungere i file corrispondenti all'archivio parco giochi.tar.
utilizzando tar con Find è un buon modo di creare backup incrementali di un albero di directory o di un intero sistema. Usando Find per abbinare i file più recenti di un file timestamp, potremmo creare un archivio che contenga solo file più recenti dell'ultimo archivio, supponendo che il file timestamp venga aggiornato subito dopo la creazione di ogni archivio.
tar può anche utilizzare sia l'input che l'output standard. Ecco un esempio completo:
[me@linuxbox pippo]$ cd
[io@linuxbox~]$ trova playground -name 'file-A' | tar cf - --files- from=- | gzip > playground.tgz
[me@linuxbox pippo]$ cd
[io@linuxbox~]$ trova playground -name 'file-A' | tar cf - --files- from=- | gzip > playground.tgz
In questo esempio, abbiamo usato il Find programma per produrre un elenco di file corrispondenti e inserirli in pipe tar. Se viene specificato il nome del file “-”, si intende lo standard input o output, a seconda delle necessità. (A proposito, questa convenzione di usare “-” per rappresentare input/output standard è usata anche da un certo numero di altri programmi). Il --file-da opzione (che può anche essere specificata come -T) cause tar leggere la sua lista di percorsi da un file piuttosto
rispetto alla riga di comando. Infine, l'archivio prodotto da tar è convogliato in gzip per creare l'archivio compresso parco giochi.tgz. .tgz extension è l'estensione convenzionale data ai file tar compressi con gzip. L'estensione .tar.gz è anche usato a volte.
Mentre usavamo il gzip programma esterno per produrre il nostro archivio compresso, versioni moderne di GNU tar supporta sia la compressione gzip che bzip2 direttamente con l'uso del z e j opzioni, rispettivamente. Utilizzando il nostro esempio precedente come base, possiamo semplificarlo in questo modo:
[io@linuxbox~]$ trova playground -name 'file-A' | tar czf playground.tgz -T -
[io@linuxbox~]$ trova playground -name 'file-A' | tar czf playground.tgz -T -
Se invece avessimo voluto creare un archivio compresso bzip2, avremmo potuto farlo:
[io@linuxbox~]$ trova playground -name 'file-A' | tar cjf playground.tbz -T -
[io@linuxbox~]$ trova playground -name 'file-A' | tar cjf playground.tbz -T -
Semplicemente cambiando l'opzione di compressione da z a j (e cambiando l'estensione del file di output in .TBZ per indicare un file compresso bzip2) abbiamo abilitato la compressione bzip2.
Un altro uso interessante dell'input e dell'output standard con il tar comando comporta il trasferimento di file tra sistemi su una rete. Immagina di avere due macchine che eseguono un sistema simile a Unix dotato di tar e SSH. In uno scenario del genere, potremmo trasferire una directory da un sistema remoto (denominato sistema-remoto per questo esempio) al nostro sistema locale:
[io@linuxbox~]$ mkdir roba remota
[io@linuxbox~]$ cd remote-roba
[me@linuxbox remote-roba]$ ssh remote-sys 'tar cf - Documenti' | catrame xf -
password di me@remote-sys: [me@linuxbox remote-stuff]$ ls Documenti
[io@linuxbox~]$ mkdir roba remota
[io@linuxbox~]$ cd remote-roba
[me@linuxbox remote-roba]$ ssh remote-sys 'tar cf - Documenti' | catrame xf -
password di me@remote-sys: [me@linuxbox remote-stuff]$ ls Documenti
Qui siamo stati in grado di copiare una directory denominata Documenti dal sistema remoto sistema-remoto in una directory all'interno della directory denominata roba remota sul sistema locale. Come lo abbiamo fatto? Per prima cosa, abbiamo lanciato il tar programma sul sistema remoto utilizzando SSH. Ricorderai che SSH permette di eseguire un programma da remoto su un computer in rete e di “vedere” i risultati sul sistema locale - lo standard output pro-
dotto sul sistema remoto viene inviato al sistema locale per la visualizzazione. Possiamo trarne vantaggio avendo tar creare un archivio (il c mode) e inviarlo allo standard output, anziché a un file (il f opzione con l'argomento trattino), trasportando così l'archivio attraverso il tunnel crittografato fornito da SSH al sistema locale. Sul sistema locale, eseguiamo tar e fallo espandere un archivio (il x modalità) fornito dallo standard input (di nuovo, il f opzione con l'argomento trattino).