File lunghi, e compressione gzip

In questo esercizio si sperimenteranno alcuni comandi che sono utili per operazioni comuni, come leggere file e comprimere (aka "zippare") files e cartelle.

Lettura di file lunghi

Il comando cat, come si è visto negli esercizi precedenti, permette di stampare sul terminale il contenuto di un file. Tuttavia, nel caso di file che contengono molto testo, questo può essere piuttosto scomodo, in quanto costringerebbe a scorrere tutto il terminale per trovare l'inizio del testo.

Per questa ragione, sono disponibili altri comandi che permettono di leggere il testo passo / passo, senza stamparlo tutto insieme, ma che allo stesso tempo non sono complessi come un editor di testo. Uno di questi comandi è less (che, in maniera forse controintuitiva, ha sostituito il vecchio comando more)

Si provi il comando less per leggere il file ~/.ssh/known_hosts creato in precedenza, al posto di cat. Per uscire da less bisogna digitare il tasto q.

Il comando less dispone di alcune caratteristiche avanzate; ad esempio, permette di effettuare la ricerca all'interno del testo, o di mostrare i numeri di riga. Come al solito, informazioni dettagliate su come attivare queste funzionalità si trovano nel manuale, consultabile con il comando man less.

Si utilizzi il comando less per aprire il file /home/robol/dante.txt, che contiene una copia della Divina Commedia in formato testuale. Si cerchi la prima apparizione della parola "Francesca" (che, come è facile immaginare, sarà nel V Canto) con lo strumento di ricerca in avanti; si attivino poi i numeri di riga per vedere a che riga compare.
Per svolgere questo esercizio, è necessario leggere il manuale!

Come si può notare, c'è una forte somiglianza fra il comando less ed il lettore di manuali man; questo non è casuale: il comando man utilizza proprio less per mostrare l'output. In particolare, tutti i comandi per la ricerca sono disponibili anche mentre si legge il manuale.

Leggere parte di un file

Spesso si può avere la necessità di leggere solo la parte iniziale o finale di un file. I comandi head e tail, come il nome suggerisce, permettono di stampare la testa e la coda di un file di testo.

Questi comandi hanno un'opzione -n che permette di scegliere quante righe di testo stampare (rispettivamente dall'inizio e dalla fine del file).

Si utilizzino i comando head e tail sul file /home/robol/dante.txt per stamparne le prime 19 e le ultime 18 righe. Si utilizzi la redirezione dell'output per creare un file dante-short.txt con solo queste 37 righe.

Promemoria: Si può usare la redirezione con >> per aggiungere testo ad un file senza sovrascriverlo.

Archivi tar, e compressione gzip

Storicamente, il salvataggio di backup veniva fatto su nastri magnetici, in inglese chiamati tape archive. Sui nastri è possibile scrivere solo dati in modo sequenziale, e questi ignorano completamente la struttura del file system.

Linux disponse di un comando apposito che crea, a partire da file contenuti in una directory, un unico file. Il comando si chiama tar, che sta appunto per tape archive.

Al giorno d'oggi è piuttosto inusuale dover scrivere su nastri magnetici, ma questo comando è ancora comodo perché supporta la compressione, e dunque permette di trasformare un qualsiasi insieme di file in un unico file, compresso.

Il comando tar può funzionare in varie modalità:

In tutti i casi, è possibile specificare l'opzione -v per stampare la lista dei file prodotti, e -z per attivare la compressione Gzip. L'opzione -j utilizza invece la compressione Bzip2, più efficiente ma anche più costosa. Per maggiori informazioni, è possibile consultare il manuale: man tar.

Creare una cartella in cui mettere una copia il file dante.txt (utilizzando il comando cp), e almeno un altro file contenente del testo a propria scelta. Comprimere questa cartella con il comando tar prima senza e poi con compressione. Qual è l'algoritmo più efficiente? Confrontare lo spazio richiesto per le varie opzioni, e poi provare ad estrarre i file all'interno di una nuova cartella di nome recovery — da crearsi con mkdir.