Ho dovuto recentemente spostare da una macchina all’altra circa 50 GB di dati, divisi in centinaia di migliaia di piccoli file, e senza avere spazio aggiuntivo sulla macchina per fare un tar zippato da poi spostare comodamente, ho provato un scp, ma dopo 45 minuti si erano spostati circa 2 GB di dati, troppo lento.
E così ho iniziato a guardare le opzioni un po più avanzate di tar.
Come prima cosa cos’e’ tar ?
Da wikipedia:
Nell’informatica, il software tar (acronimo per tape archive) permette di generare dei file utili per l’archiviazione e il backup, sia su memorie di massa che su dispositivi a nastro magnetico utilizzando il formato omonimo. Tale formato è stato reso uno standard da POSIX.1-1998 e dal successivo POSIX.1-2001. Oltre a poter immagazzinare più file, cosa che si traduce nella possibilità di accumulare dentro un singolo file migliaia di file diversi (packing), si aggiunge la conservazione delle informazioni del file system, quali l’utente, il gruppo e i permessi, data e ora, e la struttura delle directory. Secondo la tradizione Unix “ogni programma, una sola funzione”, tar non supporta direttamente la compressione.
Dal momento che tar è stato sviluppato originariamente per l’uso con dispositivi ad accesso sequenziale, quali appunto le unità a nastro, porta con sé un piccolo prezzo da pagare in termini di prestazioni per quanto riguarda l’estrazione di un singolo file, dal momento che il software deve leggere l’intero archivio per localizzarlo. L’opzione -f è utilizzata per indicare il file da utilizzare per le operazioni di scrittura o rilettura dell’archivio. Comunemente un file prodotto da tar viene denominato tarball.
tar è comunemente utilizzato in unione con un’utility esterna di compressione dati, quali ad esempio gzip, bzip2 o, non più in uso, compress, dal momento che da solo non ha la capacità di comprimere i file. Si potrebbe pensare che ciò richieda più passaggi, mentre l’operatore pipe di Unix permette di combinare i due passaggi in una sola riga di comando. Inoltre, la versione GNU di tar supporta le opzioni a riga di comando -z (gzip), -j (bzip2), e -Z (compress), che abilitano la compressione per il file che viene creato.
L’uso base del comando tar è:
Usa tar per creare un file contenente una directory e tutte le sue sottodirectory:
tar cf archive.tar dir |
Quindi estrai il contenuto in un’altra directory:
tar xf archive.tar |
Oppure se si vuole conoscere il contenuto di un file tar:
tar tf archive.tar |
Leggenda delle opzioni principali di tar:
1. c = Crea (Create)
2. x = Estrai (Extract)
3. t = Mostra i contenuti (List content)
4. v = Mostra in diretta cosa sta facendo
5. f = Nome del file
6. z = Compress and pack simultaneously (gzip).
7. j = Compress and pack simultaneously (bzip2).
Avendo una directory con file di diverso tipo:
/tmp/test┌- ls
/tmp/test┌- ls AC.11.2010.pdf accesslog_linuxaria.com_10_30_2010 bookmarks-2010-01-27.json semiogramm_farbe.pdf /tmp/test┌- du -hs . 68M . |
Si può ottenere da questa directory un file tar, un tar zippato ed un tar con bzip2
└┌(%:/tmp/test)┌- tar -cvf ../tar.tar * AC.11.2010.pdf accesslog_linuxaria.com_10_30_2010 bookmarks-2010-01-27.json semiogramm_farbe.pdf └┌(%:/tmp/test)┌- tar -czvf ../tar.tar.gz * AC.11.2010.pdf accesslog_linuxaria.com_10_30_2010 bookmarks-2010-01-27.json semiogramm_farbe.pdf └┌(%:/tmp/test)┌- tar -cjvf ../tar.tar.bzip2 * AC.11.2010.pdf accesslog_linuxaria.com_10_30_2010 bookmarks-2010-01-27.json semiogramm_farbe.pdf └┌(%:/tmp/test┌- ls -lh ../tar* -rw-r--r-- 1 tar tar 5.9K 2011-01-02 21:32 ../tar.jpg -rw-r--r-- 1 tar tar 68M 2011-01-02 22:09 ../tar.tar -rw-r--r-- 1 tar tar 30M 2011-01-02 22:07 ../tar.tar.bzip2 -rw-r--r-- 1 tar tar 30M 2011-01-02 22:09 ../tar.tar.g |
Ma finora abbiamo visto gli usi standard del tar vediamo alcuni usi “speciali”:
Rimuovere tutti i file estratti precedentemente da un archivio
tar -tf | xargs rm -r |
Spostare il contenuto di una intera directory con il comando tar :
tar cf - dir1 | (cd dir2; tar xf -) |
Spostare il contenuto di una intera directory attraverso la rete
tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )" |
Questo è il comando che ho usato per spostare i miei 50 GB (in circa 2 H), è più veloce di un scp, perché risparmia un sacco di connessioniTCP (SYN / ACK).
Se si utilizza una rete veloce (ho appena testato ethernet gigabyte) è più veloce non comprimere i dati.
Come sopra ma utilizzando le opzioni di gnu tar
tar --rsh-command ssh cvf username@remotehost:/path/to/dest/archive.tar dir1 |
Questo comando utilizzerà ssh per scrivere direttamente in un file tar remoto il contenuto della directory dir1
Copia da host1 a host2, attraverso il proprio computer
ssh root@host1 "cd /somedir/tocopy/ && tar -cf - ." | ssh root@host2 "cd /samedir/tocopyto/ && tar -xf -" |
Utile se si ha accesso a host1 ed host2 ma i 2 host non si vedono l’un l’altro.
Riferimenti: http://www.linuxjournal.com/content/stupid-tar-tricks
Popular Posts:
- None Found
For me the bottleneck is always the processing power on each end, so I’ve found it much faster to use netcat from one host to another on a secure LAN. If you don’t like giving up the encryption though, you can use ssh with “-oCiphers=blowfish-cbc,arcfour256” for a more efficient encryption algorithm.
Sempre utile, grazie.
Lo aggiungo ai segnalibri. =)
Thx alot added to fav
> tar cf – dir1 | (cd dir2; tar xf -)
Check out tar “-C” command line option. If you prefer to use the “cd”, then at least write more reliable “( cd dir2 && tar xf – )”.
> -rw-r–r– 1 tar tar 30M 2011-01-02 22:07 ../tar.tar.bzip2
Standard extension for the files is .tar.bz2, not .tar.bzip2
Also, for the article written in 2011, mention of -J/–xz and .tar.xz is a must.
Thanks for the feedback, you have reason i’m not used to the -J option but i’ve heard it can save more space than bzip2, i’ll give it a try for sure.
for transferring large number of files from one host to another – i’d rather use rsync over ssh.
rsync has an update feature in case the transfer got terminated and you want to continue where it stopped.
I use cpio – a much neglected but very useful tool. To duplicate a directory on the same box:
find mydir -depth -print | cpio -pdum /new/dir
Over a network:
find mydir -depth -print | cpio -o | ssh newhost “cd /new/dir; cpio -idum”
Useful post… I’ve never used tar from host to host via ssh.
Anyway, when the amount of data is very huge I usually use rsync+ssh (that let me to resume the upload).
Another vote for rsync. So much more robust and flexible!
This is how you tar a folder with a dot in front:
tar -cvf archive.tar \.sercetdir/
hey nice howto ^^
Thanks Dax 😉