---------------------------------------------------------------------------- Scuola di Specializzazione in Fisica Sanitaria dell'Universita' di Bologna Marcello Galli, Anno 2006-2007 Lezioni di Informatica http://www.helldragon.eu/marcello/galli_lezioni/ ---------------------------------------------------------------------------- Linux e bash shell : esercitazione Lo studente, a terminale, esegue gli esempi riportati di seguito, cercando di capire bene cosa sta facendo. ---------------- Si ricorda che: ---------------- Comandi e nomi di files sono case sensitive I comandi hanno argomenti e flags (opzioni) che ne determinano il comportamento, i flags sono espressi da lettere, precedute da '-' Es.: ls -l filename.txt mostra il file di nome filename.txt con tutte le sue caratteristiche ( flag 'l' ) # indica un commento ; separa comandi sulla stessa linea Ctrl C interrompe un comando ----------- nomi dei files e directory ------------------- / indica la root: l'inizio della struttura gerarchica nomi che non iniziano con '/' si riferiscono alla directory corrente ./ indica la directory corrente ../ indica la directory nel livello superiore ~ indica la directory principale dell'utente (detta 'home') I files il cui nome inizia con . sono "nascosti", in genere sono files di configurazione Non vanno usati spazi o caratteri speciali nei nomi di files, a meno di non racchiudere la stringa che rappresenta il nome fra apici ' ' oppure fra apici doppi " " Oppure si puo' far precedere il carattere speciale dalla barra rovesciata: '\', che impedisce alla shell di interpretarlo. nei nomi di files: * indica ogni stringa, ? un carattere singolo [a-e,l] : i caratteri a,b,c,d,e,l [!a] : escluso il carattere a per utilizzare uno di questi caratteri in un nome bisogna farlo precedere da'\' Ad esempio \* indica il carattere '*' invece che ogni stringa Esempi: a*t # indica ogni file il cui nome inizia con 'a' e finisce con 't' ?? # indica ogni file il cui nome e' composto di 2 caratteri * # indica ogni file della directory [a,b]* # i files con nomi che iniziano con 'a' oppure 'b' [a-z]* # files con i nomi che iniziano con una lettera minuscola [!a]* # files con nomi che non iniziano con 'a' ----------- accessi ai files ogni file appartiene ad un utente ed a un gruppo, ogni file ha permessi per l'accesso: i permessi sono: x,r,w ; per esecuzione, lettura, scrittura x per un direttorio indica permesso di ingresso ci sono 3 gruppi di permessi, e sono i permessi associati a: u,g,o ; per proprietario del file, gruppo che possiede il file, altri (others), a sta per tutti (all) ------------------------------------------------------------- -------------------------------------------------------------- 1. Help in linea : il comando man permette di accedere all'help in linea. Usatelo. Vi verra' mostrato l'output una pagina per volta, per scorrere il testo in avanti utilizzare la barra spaziatrice, per andare indietro la lettera b, una volta letto il testo premete la lettera q, per tornare all'uso del terminale. 1.a) Esempi: man man : spiega il comando man man touch : spiega il comando touch man -k file : cerca i comandi che riguardano file Commenti: si noti la sintassi dell'help presentato, l'opzione -k permette di fare ricerche per parole chiavi 1.b) Esempi: help : spiega qualcosa sulla shell man bash : tutto sulla bash shell ------------------------------------------------------------- 2 - Uso dei files: lo studente provi a: -- elencare i files, -- creare files, -- stampare a terminale il contenuto dei files, -- copiare, cambiare nome ai files, -- listare il contenuto di files a terminale. tenere presente che: copiare un file su un file che non esiste crea il file. copiare un file su un file esistente lo sovrascrive provare ad usare le wildcards ( * ? [a-vb] etc.) nei nomi dei files Sommario dei comandi da utilizzare: 2.a) Elencare i files e guardarne le caratteristiche: ls : mostra i files del direttorio ls -l : da informazioni complete ls -a : tutti i files, anche quelli nascosti ls -t : mostra in ordine di data ls -1 : un file per riga ls .bashrc : elenca il singolo file .bashrc ls -R : ricorsivo,(cioe' esteso a cartelle e sottocartelle) ls -lrt : ordine di data inverso ; notate come le opzioni si possano combinare insieme, precedute da un unico '-' stat nomefile : mostra tutti i dettagli sul file 2.b) Creare files e guardarne il contenuto: touch nomefile : crea file vuoto o gli cambia la data cat nomefile : mostra il file more nomefile : mostra una pagina per volta tail nomefile : mostra la fine di un file head nomefile : mostra l'inizio del file rm nomefile : elimina un file 2.c) cambiare i permessi di accesso ad un file: chmod : cambia permessi di accesso chown : cambia il proprietario od il gruppo (puo' usarlo root) chmod u+rwx filename : da permessi di accesso al proprietario chmod a-rwx filename : toglie permessi a tutti chmod a-x filename : permesso di accesso + aggiunge permessi , - toglie permessi x: esecuzione, od ingresso nella directory, r:lettura, w:scrittura u: proprietario, g: gruppo cui il file appartiene, o:altri, a: tutti 2.d) uso dei wildcards nei nomi dei files: lo studente provi ad usare le notazioni: * ? [] nei nomi dei files ESEMPI: touch uno due tre quattro # creo 4 files vuoti ls # li guardo ls *o # guardo quelli che finiscono con o ls ??o # quelli che finiscono per o ed hanno 3 lettere ls [dt][ur]e # mostra due e tre ls [!u]* # non quelli che cominciano per u ls -a # vedo anche i files di configurazione ls -l # vedo che i files sono miei quado li ho creati, che sono vuoti ( dimensione 0) touch uno ; ls -l # ora ho cambiato data a uno cp .bash_history sette # faccio il file sette mv uno unouno # cambio nome ad un file ls -l # controllo cosa ho adesso cat sette more sette # guardo cosa contiene il file tail sette head sette head -1 sette # guardo la prima riga ls -l sette # guardo le caratteristiche mv nomefile nuovonome : cambia nome ad un file ESEMPI: permessi di accesso: cp .bash_history llll # creo un file more llll # lo guardo chmod a-rw llll # gli tolgo i permessi more llll # ora non lo posso piu' vedere ls -l llll # controllo i permessi # ( i caratteri iniziali ------ mostrano # che non ho permessi ) chmod u+w llll # do all'user (me stesso) permesso di # scrittura la -l llll # controllo che permessi ho more llll # non ho il perlesso r, non lo posso vedere rm llll # pero' ora posso distruggerlo ls # controllo che non ci sia piu' ESEMPI: nomi anomali per i files i files possono avere nomi qualunque, anche con caratteri speciali ma poi e' difficile usarli, ed occorre usare gli " " od il carattere di escape \ touch 2.2.quattrocento 5.txt cp 5.txt " " # ora ho un file con un blank come nome ls # ed e' quasi invisibile ls -l cp 5.txt file\ con\ nome\ sfortunato\? # come mettere caratteri speciali nei nomi touch \* # creo un file con * come nome ls * # non mi da quel file, ma tutti ls "*" # per vedere solo il file ----------------------------------------------------------------------- 3 - Uso delle directories: lo studente provi a creare directory, spostarsi nel file system, spostare files. creare directory, file regolari e links , permessi di accesso Sommario dei comandi da utilizzare: 3.a) creare directory, muoversi fra le directory, spostare files mkdir nome : crea un direttorio rmdir nome : elimina un direttorio cd nome : ci si sposta un un sottodireettorio cd .. : si sale di un livello cd - : torna nel direttorio precedente pwd : mostra il direttorio corrente mv file file2 directory : sposta i files nella directory 3.b) permessi di accesso alle directories: chmod u+rwx dirname : da permessi di accesso al proprietario chmod a-rwx dirname : toglie permessi a tutti chmod a-x dirname : permesso di accesso + aggiunge permessi , - toglie permessi x: esecuzione, od ingresso nella directory, r:lettura, w:scrittura u: proprietario, g: gruppo cui il file appartiene, o:altri, a: tutti ESEMPI: creare directory e spostare files: touch 1a 2b 3c kkk # faccio dei files mkdir dir1 dir2 dir3 # faccio directories mkdir dir1/subdir # faccio subdirectories mv kkk dir1/subdir # sposto il file kkk cd dir1/subdir # vado nella subdirectory cp ../../[1-9]* ./ # mi copio qui i files di 2 livelli sopra ls -al # guardo cosa ho ls -al ~ # guardo la home ls -R ~ # guardo la home, e cosa c'e' sotto mkdir subdir2 touch subdir2/file ls subdir2 # non si puo' distruggere un rmdir subdir2 # directtorio pieno rm -R subdir2 # distrugge in modo ricorsivo ls subdir2 ls / # guardo in giro nel sistema ls /home cd /usr ; ls pwd # dove sono finito ? cd ~ # torno alla home mv sette dir1 # metto sette in dir1 more dir1/sette # guardo il file more /home/dir1/sette ESEMPI : permessi di accesso: chmod u-x dir1 # mi vieto l'accesso al direttorio cd dir1 pwd ls dir/sette more dir1/sette chmod u+x dir1 # mi do accesso chmod u-r dir1/sette # tolgo accesso di lettura al file ls dir1/sette # vedo il file ( accedo a dir1) more dir1/sette # ma non posso leggerlo rm dir1/sette # siccome posso scriverlo ( permesso w) posso ancora distruggerlo ------------------------------------------------------------------------- 4 - Utility per i testi: esistono programmi che permettono di fare varie operazioni su files testuali, lo studente provi ad usarli Sommario dei comandi da utilizzare: questi non alterano il file, lo modificano e mostrano in output il risultato. wc nomefile # conta caratteri di un file, parole, linee grep stringa nomefile # cerca una stringa in un file sort nomefile # mette le linee in ordine alfabetico uniq nomefile # elimina linee doppie sed s/pattern/altropattern/g nomefile # cambia pattern con altropattern sed /pattern/d nomefile # elimina linee col pattern cut -c 10-20 nomefile # estrae i caratteri dal 10 al 20 cut -d" " -f2 nomefile # estrae la seconda parola, intende che un blank separa le parole paste file1 file2 # unisce i 2 files, mettendo insieme 2 linee dei 2 files in un'unica linea paste -d: test test # separa le 2 linee con il carattere ':' tr a-z A-Z # trasformo minuscole in maiuscole diff file1 file2 # confronta 2 files riga per riga split -l10 file nome # fa tanti files che iniziano con 'nome' ognumo con 10 linee del file test tac nomefile # mette le linee del file in ordine inverso find : utility per cercare files: ESEMPI: cp ~/.bash_history test # mi faccio un file wc test # guardo quante linee ha grep ls test # guardo le linee con 'ls' sed s/ls/lllllsssss/g test # cambio una stringa sed /ls/d # elimina linee con ls paste test test # unisce i 2 files linea per linea paste -d: test test diff test test # se sono uguali non dice nulla split -l10 test nome # separo il file nome in tante parti ls nome* # quardo cosa ho ottenuto wc nome* # gurdo quante linee hanno diff nomeaa nomeab # guardo le differenze fra 2 parti tac nomeaa # guardo il file con le linee in ordine inverso find ./ -name test -print # cerco in questa directory un file no nome test e stampo il nome find ./ -name "n*" -print # cerco i files che iniziano con n find ./ -newer test -print # cerco i files piu' recenti di test ------------------------------------------------ 5 - files e links: lo studente provi a creare links e vedere in cosa differiscono dai files ordinari Sommario dei comandi da utilizzare: ln -s nome_file_fvero nome_link : crea un soft link, cioe' un riferimento ad un file, ln nome_file_fvero nome_link : crea un hard link, cioe' una copia del nome del file ESEMPI: mkdir aa aa/bb aa/bb/cc ; touch aa/bb/cc/uno ; ln -s aa/bb/cc/uno linkauno # fa un soft link ls -l # controllo che sia un link se provate a distruggere il file, il link esiste ancora, ma non punta piu' a nulla: ls -l linkauno rm aa/bb/cc/uno ls -l linkauno more linkauno viceversa se distruggete il link al file non succede nulla : touch aa/bb/cc/uno more linkauno ls -l rm linkauno ls -l aa/bb/cc/uno un link definisce un percorso relativamente alla posizione in cui si trova, se lo spostate non punta piu' a nulla: ln -s aa/bb/cc/uno link2uno mkdir subsub cat link2uno mv link2uno subsub cd subsub cat link2uno ESEMPI : links e permessi se togliete ad un link i permessi di accesso per u (u= user cioe' voi stessi) al link non succede nulla, l'operazione e' effettuata sul file vero, come potete controllare. ln -s aa/bb/cc/uno altrolinkauno chmod u-rwx altrolinkauno ls -l cat altrolinkauno ls -l aa/bb/cc/uno ------------------------------------------------------------------------------ 6a - provare ad editare un file di testo, e a scriverci dentro con un editor grafico. Potete usare nedit, kedit, kwrite, gedit od un'altro editor a scelta.: ESEMPIO: nedit nomefile ----------------------------------------------------------- 6b - Argomento avanzato: esistono editor che non hanno bisogno dell'interfaccia grafica, ma oggi si usano poco, e soprattutto in casi di emergenza, provate l'editor vi: ESEMPIO: vi nomefile vi apparira' il vostro file nel teminale a caratteri, i caratteri della tastiera corrispondono ad operazioni diverse sul file, i caratteri per un uso essenziale di vi sono elencati nella tabella seguente: carattere funzione i permette di inserire un testo, premete il tasto escape quando avete inserito a analogo ad i, ma inserisce iniziando dalla posizione successiva a quella in cui siete x elimina un carattere dd elimina una riga rx sostituisca al carattere corrente il carattere x :q! si esce senza salvare ZZ salva ed esce dall'editor -------------------------------------------------------------------------- 7 - provare a fare operazioni sui files utilizzando un file manager grafico, come Konqueror. ---------------------------------------------------------------- 8 - standard output, standard input, pipes e redirect: Ad ogni comando e' associato: - uno standard input (stdin) , - uno standard output(stdout) - uno standard error (stderr), questi possono essere rediretti su un file od altro dispositivo con gli operatori > , < , << , >> , tee | e' il simbolo della pipe, che riversa l'output di un comando sull'input del successivo Sommario dei comandi da utilizzare: cat ridirige lo standard input sullo standard output echo stringa : scrive una stringa in output ESEMPI: cat ~/.bash_profile # gira l'stdin ( il file in argomento) sull'stdout (il terminale) facendovelo vedere ls -l > elenco.txt # faccio un file con elenco files ls -l > /dev/null # /dev/null e' una pseudodevice fatta in modo # tale che quello che ci si scrive viene eliminato, # redirigere lo stdout su /dev/null equivale ad # eliminarlo echo "prova" # scrivo prova su terminale (stdout) echo "prova2 " > bbbb.txt # ora ho scritto su un file cat bbbb.txt # scarico bbbb.txt su stdout (terminale) ls -lR | more # guardo i files una pagina per volta cat > readme # questo e' un modo di scrivere in un file e qui scrivo quello # che si chiama readme che mi pare Cntrl-D # il tasto control+d # ( che significa un end of file ) # indica la fine dell'input > dummy # faccio un file vuoto di nome dummy ls > lista_files cat lista_files ls -R -1 ~ > lista_files # notate come il file venga cat lista_files # sovrascritto ls -a ~ >> lista_files # qui viene aggiunto alla fine del file cat lista_files | wc # conto le righe,parole,caratteri cat lista_files | tee elenco2 | wc # duplico anche su elenco2 ESEMPI PIU' COMPLESSI: utilizzo di utilities per i testi con le pipes: -- faccio un nuovo file con alcune parole cambiate sed s/prova/AAAAAA/g lista_files > prova diff prova lista_files # controllo le differenze diff prova lista_files | grep '>' | wc # conto le linee diverse -- conto quante righe del file: lista_files hanno la lettera p grep p lista_files | wc -- conto quante righe del file: lista_files hanno la lettera p come primo carattere cut -c1 lista_files | grep p | wc -- prendo il file: lista_files, poi: estraggo il primo carattere, lo trasformo in maiuscolo, tolgo le linee doppie e guardo il risultato una pagina per volta: cat lista_files | cut -c1 | tr a-z A-Z | uniq | more grep a lista_files | wc ---------------------------------------------------------------------- 9 - variabili di shell: la shell e' anche un vero e proprio linguaggio di programmazione. Lo studente provi a definire variabili e ad usarle; le variabili vengono sostutuite dai loro valori quando sono precedute da: '$' Le variabili sono caratteri, non valori numerici, per valutare espressioni numeriche si usa la notazione: $(( esprtessione numerica )) Sommario dei comandi da utilizzare: a="valore" # assegna valore ad una variabile a = "ddd" # non va bene, NON ci vogliono spazi attorno al segno '=' echo $a # mostra a terminale il valore di una variabile oppure una stringa b=$((3+2)) # valuta espressione intera ed assegna alla variabile la stringa corrispondente ESEMPIO: a="variabilediprova" # assegno valore ad a echo $a # guardo il valore echo a # ho dimenticato il $ il valore non viene sostituito echo voglio vedere $a # mostra la stringa, ove ha sostituito la variabile b=$a # assegno nuova variabile echo $a $b # la controllo a="SSS" # cambio in valore echo $a echo * # vedo i miei files. Il carattere * viene espanso dalla shell echo \* # adesso va bene echo "*" echo "$a" # sostituisce la variabile entro "" echo '$a' # non sostituisce entro ' ' c=2+3 echo $c # le variabili sono stringhe non numeri c=$((2+3)) # adesso va bene echo $c ---------------------------------------------------- 10. Environment Il comportamento della shell e' determinato da variabili di ambiente, come PATH, SHELL , PS1, che potete cambiare, eventualmente ridefinendole nei files .bashrc e .bash_profile Questi due files vengono eseguiti automaticamente quando iniziate una sessione di lavoro. Il valore di una variabile si ottiene con l'operatore $, ESEMPIO: echo $PATH # che mostra i direttori ove la shell # cerca di default gli eseguibili # ( il contenuto della variabile $PATH ) PS1="iome=>" # come cambiare il prompt ESEMPI PIU' COMPLESSI: env # mostra le variabili definite echo $PS1 # in PS1 c'e' il prompt echo '$PS1' # la stringa non viene sostituita echo "$PS1" # la stringa viene sostituita echo PS1 # la stringa non viene sostituita PS1="prompt " # Il propt si puo' personalizzare PS1="\a ... " # beep PS1="\t -> " # che ora e' PS1="`hostname` `pwd` " # host e direttorio `` esegue il comando e sostituisce con l'output del comando PS1=$PWD mkdir subdir7 cd subdir7 # in questo modo non va PS1=`echo $PWD ` # neanche cosi' va, PWD viene # sostituito subito, una volta sola PS1="`echo \\$PWD `" # questo e' il modo corretto, certe # volte ottenere quello che si # vuole non e' immediato PS1="\`ls -l \`" # si possono fare anche cose assurde bash .bshrc e' rieseguito nella nuova shell e ridefinisce PS1 come all'inizio cd ~ mkdir prova16 prova16/prova17 OLDPWD=~/prova16/prova17 cambiando questa variabile la shell cd - crede che prima eravate li' e cd - pwd vi ci porta TERM i nomi dei terminali possibili sono in /usr/lib/terminfo , provate a cambiare il vostro in modo da confondere il computer ESERCIZIO: guardare i files .bashrc .bash_profile e capire cosa fanno, provare ad alterarli source ~/.bashrc esegue .bashrc nella shell corrente . ~/.bashrc fa la stessa cosa compito: provare l'operatore $ , Questo operatore si puo' usare in modo da sostituire solo parte di un nome touch a1.txt echo ${a%txt} echo ${a%t*} echo ${a%%t*} echo ${a#?1} echo ${a##*t} echo ${a/1/2} cambia 1 con 2 echo ${a:2:4} dal byte 2 al 4 mv $a ${a%txt}.dat cambio suffisso al nome $(( )) valuta operazioni aritmetiche echo $((3+2)) # da 5 ---------------------------------------------------- 11- Alias per i comandi : si possono ridefinire i comandi, definendo per essi degli alias. ESEMPI: echo " prova" > a # mi faccio un file copy a b # il comando copy non esiste alias copy="cp" # mi piace e me lo definisco io copy a b # adesso va unalias copy # elimino l'alias copy a c # non va piu' alias dir='ls --color=auto -1' # posso assegnare opzioni dir dir --color=never # se la metto nel comando in modo quella dir # esplicito quella dell'alias non vale alias # elenco degli alias attivi type -all ls # mostra l'alias ls -------------------------------------------------------------- 12 - Argomento avanzato : Procedure e loro costrutti entro una procedura: $0 e' il nome della procedura $1 $2 .. sono gli argomenti $# e' il numero di argomenti Sommario dei comandi utili : if condizione then comando comando elif condizione comando comando fi for i in file file do comando comando done while condizione finche e' vera do comando comando done until condizione finche e' falsa do comando comando done case $i in *.gif ) xv $i ;; *.txt ) more $i ;; esac formati per le condizioni: [ $a -lt $b ] c'e' anche -gt -le -ge -eq -neq = != confrontano stringhe [ file1 -nt file2 ] file1 piu recente di file2 [ file1 -ot file2 ] file1 piu vecchio di file2 [-n stringa ] vero per stringa non nulla [ stringa1 = stringa2 ] [ stringa1 != stringa2 ] [ -d file ] vero se il file e' un direttorio [ -e file ] se esiste [ -x file ] se si puo' eseguire [ -r file ] se si puo' leggere [ -w file ] se si puo' scrivere [ -s file ] esiste e non e' vuoto -L link , -f regular file, -O , -G sei il proprietario o del gruppo esecuzione condizionale dei programmi: command && command2 command2 eseguito se command riesce (ret.code 0) command || command2 command2 eseguito se command fallisce funzioni: functione nome () { comando ; comando } declare -f mostra le funzioni dfinite entro una funzione : $# e' il numero di argomenti $1 $2.. sono gli argomenti $* tutti gli argomenti $0 il nome della procedura ESEMPIO: function eco(){echo "$0 executing: eco $*" ; for i in $* ; do echo $i ; done ; } eco a b c d Compito: scrivere semplici procedure di shell, gli stessi comandi possono essere messi in un file, oppure dati a terminale ESEMPI: for i in *.zip ; do zipinfo -h $ i ; done ( for i in *.zip ; do zipinfo $ i ; done ; ) | more perche qui uso ( ) ? for i in * ; do if [ -d $i ] ls $i elif [-r $i ] head $i fi done for i in $( seq 1 10 ) ; do touch nome_$i ; done crea nome_1 nome_2 .. il comando seq crea una sequenza di numeri for i in rosso blu nero ; do touch file_${i}xx$i ; done for i in rosso blu nero ; do touch file_$ixx$i ; done notate l'uso delle {} per separare i da x nel secondo file si usa la variabile $ixx che e' vuota for i in `lpstat -a | cut -f1 -d" " ` ; do lpq -P$i ; done con questo guardo lo stato di tutte le stampanti; i comandi fra apici rovesciati: ` ` vengono eseguiti e il loro output inserito al posto della parte fra apici. lpstat mostra tutte le stampanti, una per riga; la prima parola nella riga e' il nome della stampante, con cut seleziono il primo campo dell'output, ovvero il nome delle stampanti. La lista delle stampanti cosi' creata e' l'insieme dei valori assunti dalla variabile $i nel for ----------------------------------------------------------- 13- Argomento avanzato : processi batch: processi in backgound: un processo in background corre per conto suo, in modo non interattivo. provare a far partire un porcesso, fermarlo, farlo andare in background, riportarlo in foreground far eseguire una procedura in un momento stabilito usando at Esempio: poniamo che i files: comando , comando1 contengano lunghe procedure ; comando1 & # esegue la procedura comando1 in modo indipendente nohup comando1 & # la procedura continua anche quando si chiude # il terminale comando # la procedura e' eseguita in modo interattivo Ctrl z # la procedura e' ora interrotta jobs # mostra i nostri processi in background fg %1 # bg %1 porta in background , fg in foreground kill -9 ` ps | grep comando1 | cut -f1 -d" " ` uccide il processo comando1 ---------------------------------------------------- 14- Archivi e compressione Ci sono molti programmi per creare archivi di files e comprimere files Uno dei compressori piu' usato e' il gzip, abbiamo poi zip, che si trova anche sotto Windows, e tar per gli archivi. Poniamo di avere una directory vecchilavori contenente files da archiviare: per creare un archivio con questi files si fa: tar -cvf vecchilavori.tar vecchilavori per vedere cosa contiene l'archivio: vecchilavori.tar si fa: tar -tvf vecchilavori.tar Possiamo spostare l'archivio in un'altra directory ed estrarre i files con: mkdir altradir ; mv vecchilavori.tar altradir ; cd altradir tar -xvf vecchilavori.tar Per comprimere l'archivio: gzip vecchilavori.tar otterremo un file di nome vecchilavori.tar.gz , che dovrebbe essere di minori dimensioni. Per espandere un file compresso: gunzip vecchilavori.tar.gz Si puo' direttamente decomprimere ed estrarre con: tar -xvzf vecchilavori.tar.gz e comprimere mentre si fa l'archivio, con: tar -cvzf vecchilavori.tar.gz vecchilavori Si puo' usare una pipe per fare le 2 operazioni di archiviazione ed estrazione, od il contrario, ad esempio: zcat vecchilavori.tar.gz | tar -xvf - tar -cvf - vecchilavori | gzip - zcat de-comprime e scarica il file decompresso su stdout il segno - indica che l'output (o l'input) sono presi dalla pipe. Notate il seguente costrutto, per spostare un insieme di files e directory mantenendo le tutte proprieta' dei files: tar -cvf - olddir | ( cd newdir ; tar -xvf - ) la directory olddir e tutto quewllo che contiene viene trasformata in un archivio, questo viene passato, tramite la pipe, ai comandi fra parentesi tonde; questi si mettono della directory newdir e li' estraggono quello che entra dalla pipe. ------------------------------------------------------------------