Shell: Parte 1

Cosa faremo oggi?

Riassunto lezione 1.

Creare un File

Per poter creare un file, è necessario disporre di un editor di testo, nel nostro caso usermo nano un editor utilizzabile da terminale

CREARE/APRIRE UN FILE:

nano nome_del_file.txt

Per poter salvare le mofiche appena effettuate premere Ctrl + S, mentre per chiudere l’editro premere Ctrl + X

PROVATE VOI

Create un file.txt e scriveteci un paio di righe:

nano file.txt
Ciao mi chiamo bla bla bla ...
Ctrl + S
Ctrl + X

Comando cat

Il comando cat permette di visualizzare file testuali:

cat file.txt

PROVATE VOI

Ora provate a leggere il file che avete appena scritto.

Il comando cat stampa a video il contenuto di un file, ma questo puo essere reindirizato su un altra sorgente ad esempio un file:

cat prova.txt > nuova_prova.txt

il comando permette anche di concatenare piu file in un unico file:

nano prova1.txt
nano prova2.txt
cat prova1.txt prova2.txt > concat_prova_1_2.txt

Ora il file concat_prova_1_2.txt contiene la concatenazione dei file prova1 e prova2.


Wildcards

La shell esegue quella che si chiama wildcard expansion: ogni volta che incontra l’asterisco * lo sostituisce con la lista dei file/directory che “fanno match”.

ESEMPIO. Se eseguo:

ls *

la shell sostituisce * con la lista di tutti i file e le directory nella directory attuale (perche’ tutti fanno match con *). Invece:

ls informatica/*

sostituisce * con la lista dei file in informatica.

Supponendo che in informatica ci siano solo tre file, chiamati test1, test2 e results, il comando precedente sarebbe equivalente a:

ls informatica/test1 informatica/test2 informatica/results

Se avessi eseguito:

ls informatica/test*

la wildcard test* avrebbe fatto match solo con test1 e test2, ed il comando sarebbe stato equivalente a:

ls informatica/test1 informatica/test2

Qui results non fa match, quindi non viene incluso.

Le wildcard piu’ importanti sono:

wildcard fa match con
akz il testo “akz
* una stringa qualunque (anche vuota)
? un carattere qualunque
[akz] un carattere solo tra a, k e z
[a-z] un carattere alfabetico qualunque
[0-9] una cifra qualunque
[!1b] un carattere qualunque che non sia 1 o b
[!a-e] un carattere qualunque che non sia a, b, …, e

Quando la shell incontra un comando dove uno (o piu’) degli argomenti contiene delle wildacrds, esegue la wildcard expansion: sostituisce all’argomento incriminato tutti i file che fanno match con la wildcard.

Warning

Le wildcards sono simili alle regex, ma non sono la stessa cosa:

  1. Le wildcards sono usate dalla shell per fare il match di percorsi.
  2. Le regex sono usate da grep per fare il match di righe di testo contenute in un file.
  3. Le regole che determinano il match di wildcards e regex sono diverse.

Esempio. La wildcard:

le rose sono *se

fa match con:

le rose sono rosse

ma anche con:

le rose sono costose

e:

le rose sono grosse

ma non con:

i maneggi abitano in montagna

Le wildcard possono essere combinate, ad esempio:

test?[a-z][!0-9]

fa il match con tutti i percorsi che cominciano con test, proseguono con un carattere qualunque, poi con un carattere alfabetico ed infine con un carattere non numerico.


Esempio. Un esempio piu’ realistico. Il comando:

cat data/dna-fasta/*.[12]

fa match con tutti i file nella directory data/dna-fasta il cui filename e’ composto di una-stringa-qualunque, seguita da un punto, seguito da 1 o 2 e nient’altro. Nel nostro caso i soli file a fare match sono:

data/dna-fasta/fasta.1
data/dna-fasta/fasta.2

Dopo la wildcard expansion il comando precedente diventa:

cat data/dna-fasta/fasta.1 data/dna-fasta/fasta.2

PROVATE VOI create le seguenti directory e sub-directory

  1. data
  2. data/deep1
  3. data/deep1/1
  4. data/deep2
  5. data/deep2/1
  6. data/deep3
  7. data/deep3/1
  8. data/deep4
  9. data/deep4/1

Stampare a schermo i contenuti della directory data:

ls data

Per stampare i contenuti delle directory che stanno in data:

ls data/*

Per stampare a schermo solo il contenuto delle directory deep0, …, deep4:

ls data/deep*

Mentre per restringere la wildcard alle directory deep0 e deep3:

ls data/deep[03]

e solo per le directory deep0, …, deep4 ma non deep2:

ls data/deep[!2]

Esercizi 10 min

  1. Create 3 file usando l editor nano
  2. Copiate i 3 file usando cp nel folder “prova”
  3. create un quarto file chiamato concat.txt contenente la concatenzione dei 3 file creati

TRA 10 min invio le soluzioni nella chat