Shell: Parte 1¶
Cosa faremo oggi?¶
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:
- Le wildcards sono usate dalla shell per fare il match di percorsi.
- Le regex sono usate da
grepper fare il match di righe di testo contenute in un file. - 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
- data
- data/deep1
- data/deep1/1
- data/deep2
- data/deep2/1
- data/deep3
- data/deep3/1
- data/deep4
- 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¶
- Create 3 file usando l editor
nano - Copiate i 3 file usando
cpnel folder “prova” - create un quarto file chiamato concat.txt contenente la concatenzione dei 3 file creati
TRA 10 min invio le soluzioni nella chat