Guida ai comandi da terminale: differenze tra le versioni

Riga 524: Riga 524:


=== Comprimere files e directory ===
=== Comprimere files e directory ===
La creazione di un nuovo file con il comando <tt>tar</tt> viene fatta mediante l'opzione <tt>-c</tt> indicando il nome del file da creare e il file o la directory originali:
<code>
$ tar cf nuovo.tar dir/
</code>
Il file creato contiene l'intera directory <tt>dir/</tt>. Per estrarre la directory dall'archivio utilizziamo l'opzione <tt>-x</tt>:
<code>
$ tar xf nuovo.tar
</code>
l'archivio verrà estratto interamente nella directory corrente.<br/>
L'opzione <tt>-f</tt> utilizzata fino ad ora serve ad indicare che il campo direttamente successivo sarà il nome dell'archivio.
<br/>
Tuttavia in questo esempio non abbiamo utilizzato alcun software di compressione per ridurre la dimensione dei dati nell'archivio. Per farlo possiamo scegliere se utilizzare il software di compressione ''gzip'' (opzione -z) o con ''bzip2'' (opzione -j):
<code>
$ tar czf nuovo.tar.gz dir/      # utilizza gzip
$ tar cjf nuovo.tar.bz2 dir/      # utilizza bzip2
</code>
Analogamente per decomprimere:
<code>
$ tar xzf archive.tar.gz
$ tar xjf archive.tar.bz2
</code>
L'estensione dei due file è stata cambiata da ''.tar'' a ''.tar.gz'' e ''.tar.bz2'' per indicare chiaramente con quale tipo di algoritmo sono stati compressi i dati. Esistono versioni compatte delle stesse estensioni: ''.tgz'' equivale a ''.tar.gz'' e ''.tbz'' equivale a ''.tar.bz2''.
<br/>
Nota: l'estensione corretta in realtà non è assolutamente necessaria. Possiamo chiamare tutti gli archivi .tar indipendentemente dalla compressione e questi funzioneranno perfettamente. Tuttavia in questo modo l'utente non ha modo di conoscere a colpo d'occhio l'algoritmo utilizzato.
<br/>
Una opzione basilare interessante è <tt>-t</tt> con la quale possiamo stampare il contenuto di un file compresso. Ad esempio:
<code>
$ tar tzf archive.tar.gz
</coded>
Nel caso in cui l'archivio non sia stato compresso utilizzando ''gzip'' o ''bzip2'' è possibile aggiungervi singoli file o intere directory utilizzando la modalità append attivata dall'opzione <tt>-r</tt>:
<code>
$ tar rf archive.tar file dir/
</code>
Nota: è importante che l'archivio non sia compresso. Nel caso lo sia è possibile prima eliminare la compressione dall'archivio e poi aggiungere dei file. Alla fine verrà ricompresso il tutto.
==== Esempi ====
# Comprimere tutte le immagini jpg dentro una directory:
<code>
$ tar cvzf photo.tar.gz photo/*.jpg
</code>
# Come sopra ma il file viene inserito nella directory dove le foto risiedono:
<code>
$ tar cvzf photo/photo.tar.gz photo/*.jpg
</code>
# Comprimere la directory corrente (1):
<code>
$ tar cvjf current.tar.bz2 .
</code>
# Comprimere la directory corrente (2):
<code>
$ tar cvjf current.tar.bz2 *
</code>
Nota: La differenza tra i due comandi precedenti è abbastanza semplice. Nel primo caso ad essere compressa è la reale direcotry corrente. Scompattando l'archivio ci troveremo con una directory che contiene tutti i file. Nel secondo caso invece ad essere compressa non è la directory bensì tutti i file che essa contiene. Scompattando non troveremo una cartella contenente ma tutti i file contenuti nell'archivio saranno copiati nella directory di scompattazione senza che sia creata la subdirectory.
# Copiare una directory:
<code>
$ tar cf - /some/directory | (cd /another/directory && tar  xf -)
</code>
# Estrarre tutti i file .h da un archivio:
<code>
$ tar xvzf source.tar.gz *.h
</code>
# Cerca tutti i file .jpeg nella home e crea un archivio:
<code>
$ find ~ -type f -name "*.jpg" | xargs tar cvzf photo.tar.gz
</code>
# Se stiamo cercando di creare un archivio molto grande è più conveniente il seguente metodo:
<code>
$ find ~ -type f -name "*.jpg" | xargs tar rvzf photo.tar.gz
</code>
nel quale abbiamo usato l'opzione append (-r) invece della create (-c). Questo perchè nel caso di archivi molto grandi xargs passa tutti gli argomenti a blocchi e tar ricrea ogni volta l'archivio con solamente i file elencati in quel blocco all'interno. La modalità append risolve il problema.
# Estrarre singoli file da un archivio:
<code>
$ tar xvjf archive.tar.bz2 file1.cpp file2.cpp file3.cpp
</code>
# Estrarre file dalle subdirectory di un archivio: o subdirectory intere:
<code>
$ tar xvjf archive.tar.bz2 subdir1/file1.cpp subdir2/file2.cpp
</code>
# Estrarre una intera subdirectory da un archivio:
<code>
$ tar xvjf archive.tar.bz2 subdir1/
</code>
Nota: Per poter estrarre singoli file o subdirectory occorre conoscerne con esattezza i nomi. Tuttavia è possibile utilizzare altri comandi come find, grep, awk per ottenere un elenco dei file che vogliamo estrarre.
# Estrarre da un archivio solo i file elencati in un file di testo:
<code>
$ tar xvf archive.tar -T list.txt
</code>
# Importare in un file di testo tutti gli elementi di un archivio:
<code>
$ tar tzf archive.tar.gz > list.txt
</code>
# Eliminare da una directory contenente molti file solo quelli contenuti anche nell'archivio:
<code>
$ tar tzf archive.tar.gz | xargs rm -r
</code>
# Stimare la dimensione di un archivio prima di crearlo:
<code>
$ tar czf - directory/ | wc -c
</code>


=== Modificare l'ora di accesso a un file ===
=== Modificare l'ora di accesso a un file ===