summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena of Valhalla'' Grandi <valhalla@trueelena.org>2014-02-18 22:36:02 +0100
committerElena of Valhalla'' Grandi <valhalla@trueelena.org>2014-02-18 22:36:02 +0100
commit62e724af131facf5033472a08205bc9507842814 (patch)
tree61d24ca31ff7b77cfa70b0b916be03b936a3647b
parentd85db403e6a73d790c8d17847125903add3d7702 (diff)
Riga di comando: log lezione 5
-rw-r--r--src/corsi/2014-linea_di_comando.txt4
-rw-r--r--src/corsi/2014-linea_di_comando/index.txt2
-rw-r--r--src/corsi/2014-linea_di_comando/log-lezione_5-raw.log168
-rw-r--r--src/corsi/2014-linea_di_comando/log-lezione_5.log155
4 files changed, 328 insertions, 1 deletions
diff --git a/src/corsi/2014-linea_di_comando.txt b/src/corsi/2014-linea_di_comando.txt
index ae4740d..8edb033 100644
--- a/src/corsi/2014-linea_di_comando.txt
+++ b/src/corsi/2014-linea_di_comando.txt
@@ -93,11 +93,13 @@ grazie alla documentazione sia preinstallata (manpages) che online.
* Globbing
* Espressioni regolari
+* `log della lezione 5 <2014-linea_di_comando/log-lezione_5.log>`_
+* `materiale della lezione 5 <2014-linea_di_comando/riga_di_comando-lezione_5.tar.xz>`_
25 febbraio
~~~~~~~~~~~
-TBA
+* Controllo dei processi
..
vim: set filetype=rst sw=3:
diff --git a/src/corsi/2014-linea_di_comando/index.txt b/src/corsi/2014-linea_di_comando/index.txt
index 5ebb3ea..7d4fde3 100644
--- a/src/corsi/2014-linea_di_comando/index.txt
+++ b/src/corsi/2014-linea_di_comando/index.txt
@@ -17,6 +17,8 @@
file: log-lezione_4.log
file: log-lezione_4-raw.log
file: riga_di_comando-lezione_5.tar.xz
+ file: log-lezione_5.log
+ file: log-lezione_5-raw.log
/restindex
uservalues
diff --git a/src/corsi/2014-linea_di_comando/log-lezione_5-raw.log b/src/corsi/2014-linea_di_comando/log-lezione_5-raw.log
new file mode 100644
index 0000000..8f3e76f
--- /dev/null
+++ b/src/corsi/2014-linea_di_comando/log-lezione_5-raw.log
@@ -0,0 +1,168 @@
+21:03 <@valhalla> Ciao a tutti, benvenuto alla quinta lezione del corso sulla riga di comando
+21:03 <@valhalla> come al solito, spostarsi sulla directory delle altre volte con cd, pwd ed ls per controllare, e poi si pu`o scaricare il materiale di stasera
+21:03 <@valhalla> wget http://www.lifolab.org/corsi/2014-linea_di_comando/riga_di_comando-lezione_5.tar.xz
+21:03 -!- polva [~polva@host33-135-dynamic.43-79-r.retail.telecomitalia.it] has joined #lifo
+21:03 <@valhalla> e poi scompattarlo con tar -x -v -f riga_di_comando-lezione_5.tar.xz
+21:05 -!- JulesX [~lorenzo@adsl-ull-235-115.51-151.net24.it] has joined #lifo
+21:05 <@valhalla> come al solito, se ci sono domande si possono fare sul canale #lifo-comande
+21:05 <@valhalla> ehm
+21:05 <@valhalla> #lifo-domande
+21:05 -!- valhalla changed the topic of #lifo to: LIFO - Laboratorio Informatico Free ed Open - 18 febbraio: quinta lezione riga di comando http://lifolab.org/corsi/2014-linea_di_comando.html - http://lifolab.org - http://social.gl-como.it/profile/lifo - domande su #lifo-domande
+21:06 <@valhalla> dove c'è diego71 che le riporta qui in canale (o se avete qualche problema vi aiuta direttamente a risolverlo)
+21:07 <@valhalla> l'argomento di stasera è "cercare le cose"
+21:09 <@valhalla> negli ultimi anni si sono diffuse un sacco di soluzioni (specialmente da interfaccia grafica) per indicizzare i file e poi ritrovarli, ma stasera parliamo dei due tool base forniti dall'interfaccia testuale per cercare file (find) e per cercare nei contenuti dei file
+21:09 <@valhalla> innanzitutto, prepariamo l'ambiente: ``cd lezione_5`` ``mkdir esercizi`` ``cd esercizi``
+21:09 <@valhalla> a questo punto, possiamo ricordare che già nella prima lezione avevamo parlato di caratteri speciali per indicare pi`u file con una stringa sola
+21:10 <@valhalla> ad esempio, ``ls ../../lezione_?`` vi elenca i contenuti di tutte le directory col nome che inizia per ../../lezione_ seguito da un solo carattere
+21:11 <@valhalla> questo è parte del cosiddetto "globbing", ovvero una sintassi abbastanza semplice per specificare più stringhe in base ad un pattern che queste rispettano
+21:12 <@valhalla> l'altro carattere molto usato che avevamo visto è ``*``, che indica zero o pi`u caratteri qualsiasi
+21:12 <@valhalla> (qui c'è un errore nelle dispense, dove ho scritto uno o più, invece vale anche zero caratteri)
+21:13 <@valhalla> ad esempio, prepariamoci un po' di file con ``touch file_uno file_due file_tre file_quattro cinque``, che crea un po' di file vuoti
+21:13 <@valhalla> ``ls`` per vedere cosa c'è, e poi ``ls file_*`` che vedremo stamperà solo ``file_uno file_due file_tre file_quattro``, ma non ``cinque``
+21:14 <@valhalla> possiamo anche vedere tutti i file con un numero da tre caratteri, con ``ls file_???``
+21:14 <@valhalla> (quindi né file_quattro, né cinque)
+21:16 <@valhalla> questo globbing viene effettuato direttamente dalla shell, che poi passa ai programmi l'elenco dei file che soddisfacevano i requisiti
+21:16 <@valhalla> ci sono domande fin qui?
+21:17 <@valhalla> ovviamente, elencare file in questo modo non è molto utile ai fini del trovare qualcosa che non sappiamo dove sia :)
+21:17 <@valhalla> a questo viene in aiuto il comando find
+21:19 <@valhalla> find è un comando che ha una sintassi leggermente diversa dal solito, e a volte fa uso di magia nera, ma serve per trovare sul filesystem dei file che soddisfano determinate condizioni nei *metadata*
+21:20 <@valhalla> ovvero, può fare ricerche sul nome, sul tipo di file, sulla data, proprietario, dimensioni e quant'altro, ma non sui contenuti
+21:20 -!- albertux [~Icedove@dynamic-adsl-78-14-228-201.clienti.tiscali.it] has quit [Quit: Alla prossima...]
+21:20 <@valhalla> la sintassi è ``find $DOVE_CERCARE $COSA_CERCARE``
+21:21 <@valhalla> dove $COSA_CERCARE è composto da varie opzioni -nome_opzione valore
+21:21 <@valhalla> ad esempio, diamo il comando ``touch file_une``
+21:22 <@valhalla> e poi ``find ../../ -name "file_un?"
+21:22 <@valhalla> notare le ": servono perché vogliamo che sia find a leggere quel ?, non vogliamo che venga interpretato dalla bash
+21:23 <@valhalla> se non avessimo messo le virgolette, ``find ../../ -name file_un?`` sarebbe stato trasformato in ``find ../../ -name file_une file_uno``, che non è quello che vogliamo (e da errore)
+21:23 <@valhalla> quel comando trova nella directory ../../ tutti i file il cui nome è ``file_un`` seguito da un carattere qualsiasi, e niente altro
+21:24 <@valhalla> se usiamo ad esempio ``find ../../ -name "file_u?"`` non troverà niente, mentre nel nostro caso specifico ``find ../../ -name "file_u??" troverà gli stessi file
+21:24 <@valhalla> domande fin qui?
+21:24 <@valhalla> direi di no, proseguo
+21:25 <@valhalla> un altra condizione che ogni tanto si usa sono le dimensioni, ad esempio ``find ../../ -size 1504c`` trova tutti i file che occupano esattamente 1504 byte
+21:26 <@valhalla> il suffisso ``c`` sta per byte, ci sono anche k, M e G che stanno più intuitivamente per kilobyte, megabyte e gigabyte
+21:27 <@valhalla> (può essere utile ad esempio per trovare file da esattamente 2G, che probabilmente son stati troncati su qualche filesystem primitivo :)
+21:28 <@valhalla> per il nome, dimenticavo, c'è anche la variante -iname, che cerca il nome ignorando maiuscole e minuscole
+21:28 <@valhalla> e poi ci sono millemila altre opzioni, che si trovano sulla pagina di manuale
+21:29 <@valhalla> domande fin qui?
+21:29 <@diego71> < tiziano> perché find ../../ e non find . (directory corrente)?
+21:29 <@valhalla> perché così trovava anche riga_di_comando-lezione_5.tar.xz che è quello di cui avevo controllato le dimensioni :)
+21:29 -!- Delfino1983 [~Alex@host40-54-dynamic.250-95-r.retail.telecomitalia.it] has joined #lifo
+21:29 -!- Delfino1983 [~Alex@host40-54-dynamic.250-95-r.retail.telecomitalia.it] has quit [Changing host]
+21:29 -!- Delfino1983 [~Alex@unaffiliated/delfino1983] has joined #lifo
+21:30 <@valhalla> effettivamente più spesso lo si fa o sulla directory corrente oppure su qualche directory "famosa"
+21:30 -!- Delfino1983 [~Alex@unaffiliated/delfino1983] has quit [Client Quit]
+21:30 <@valhalla> tipo ``find /home -size +128M`` per trovare che utenti di un sistema stanno sprecando spazio :D
+21:31 <@valhalla> altre domande?
+21:31 <@valhalla> (ovvero, trovare i file nelle directory sotto ``/home`` che occupano più di 128 MB
+21:32 <@diego71> riassumo la domanda di gioque: differenze tra find e locate
+21:33 <@valhalla> locate tiene un indice di tutti i nomi di file che c'erano sul filesystem quando ha fatto ha fatto la passata di indicizzazione
+21:34 <@valhalla> di solito i sistemi sono configurati (tramite cron, che per`o qui è un po' OT) per fare quella passata ogni giorno o ogni settimana, ma se si è aggiunto qualcosa di più recente non lo trova
+21:35 <@valhalla> find invece legge i contenuti del disco nel momento in cui lo si lancia, e quindi è in generale pi`u lento, ma permette anche di trovare file recenti e di usare criteri diversi dal nome del file
+21:35 <@valhalla> altre domande?
+21:36 <@valhalla> < polva> non c'è quindi un modo per trovare file con un range di dimensione?
+21:36 <@valhalla> usando due volte -size, una volta con +$DIMENSIONE_MINIMA ed una volta con -$DIMENSIONE_MASSIMA
+21:36 -!- malo_ [~malo@217.203.145.211] has quit [Quit: Sto andando via]
+21:37 <@valhalla> altre domande?
+21:37 <@diego71> < tiziano> posso usera find per cercare solo directories rispondenti a determinati criteri?
+21:38 <@valhalla> uno dei criteri può essere -type d per dire che quello che vuoi trovare deve essere una directory
+21:38 <@valhalla> (oppure -type f per un file regolare, o -type l per un link simbolico)
+21:38 <@valhalla> poi dipende da cosa vuoi come "determinati criteri"
+21:38 <@valhalla> altre domande?
+21:39 <@valhalla> un'altra cosa che find può fare è agire sui file trovati
+21:39 <@valhalla> non vi faccio esempi dell'opzione -delete, con la quale è mooooolto facile fare danni
+21:40 -!- rasalgethi [~quassel@host111-245-dynamic.17-79-r.retail.telecomitalia.it] has left #lifo []
+21:40 <@valhalla> ma si pu`o eseguire un comando su ciascuno dei file trovati usando l'opzione ``-exec``:
+21:40 <@valhalla> ``find ../../ -size 1504 -exec /bin/ls -l {} \;
+21:40 <@valhalla> dove dopo exec tutto viene interpretato come il comando da eseguire fino a che non si arriva a \;
+21:41 <@valhalla> e al posto di {} andrà il nome del file che è stato trovato
+21:41 <@valhalla> in questo caso ho usato un comando che non fa danni, ovviamente il rischio di distruggere dati c'è anche qui, se si usa il comando sbagliato
+21:41 <@valhalla> domande?
+21:42 <@diego71> < aldagaau> find /home/ -size +128M -150M (da un errore find: Argomento "$" non valido per -size
+21:42 <@valhalla> ``find ../../ -size -100c -size +10c``
+21:42 -!- lucmon71 [~luca@net-93-71-184-195.cust.vodafonedsl.it] has joined #lifo
+21:42 <@valhalla> ci vuole due volte l'opzione -size
+21:44 <@valhalla> (nel comando di prima, ho dimenticato c per la dimensione in byte, come era prima non trovava nessun file)
+21:44 <@valhalla> (quello giusto è ``find ../../ -size 1504c -exec /bin/ls -l {} \;``
+21:45 <@diego71> < tiziano> $ find /home -type d -size +128M #cosa c'è di sbagliato in questo comando?
+21:45 <@valhalla> che le directory hanno sempre come dimensione 4096 byte o qualche valore simile (dipende dal filesystem)
+21:45 <@valhalla> i *contenuti* della directory hanno una dimensione ben diversa, ma non è quello su cui find lavor
+21:45 <@valhalla> a
+21:46 <@valhalla> altre domande?
+21:46 <@valhalla> leggo che ci sono problemi con la sintassi di find: se vi state chiedendo se è magia nera, s`i, lo è :)
+21:47 <@valhalla> è ancora pi`u pignolo della media dei programmi da riga di comando, ed ha una fraccata di opzioni anche esoteriche
+21:47 <@valhalla> se non ci sono altre domande, proseguo
+21:48 <@valhalla> con find si cerca tra i metadata dei file, per cercare invece sui contenuti dei file di testo esiste grep
+21:48 <@valhalla> grep ha una sintassi che è il contrario di quella di find: ``grep $COSA_CERCARE $FILE_IN_CUI_CERCARE``
+21:49 <@valhalla> e $COSA_CERCARE non è un semplice globbing, ma un espressione regolare
+21:49 <@valhalla> che è potenzialmente pi`u potente e più complicata
+21:49 <@valhalla> un caso semplice che si usa spesso è selezionare tutte le righe di uno o più file che contengano qualche stringa ben specifica
+21:50 -!- huginmunin [~supybot@212-124-162-68.v4.ngi.it] has quit [Ping timeout: 272 seconds]
+21:50 <@valhalla> ad esempio ``grep "(1)" ../dispensa.rst`` vi trova tutti i comandi introdotti di cui si parla in questa dispensa
+21:51 <@valhalla> ``grep "(1)" ../../lezione_?/dispensa.rst`` fa più o meno la stessa cosa, in tutte le dispense di questo corso
+21:51 <@valhalla> dove il ? viene interpretato dal globbing della shell, mentre grep cerca semplicemente la stringa "(1)"
+21:52 <@valhalla> grep stampa poi tutta la riga che soddisfa la ricerca
+21:52 <@valhalla> domande?
+21:53 <@valhalla> con il semplice grep "(1)" per`o abbiamo visto che trova anche righe che non c'entrano
+21:53 <@valhalla> possiamo migliorare la cosa usando alcuni dei caratteri delle espressioni regolari
+21:54 <@valhalla> in questo caso, per cercare zero o più caratteri non basta pi`u usare * come prima
+21:54 <@valhalla> ma bisogna dire quale carattere e quante volte si ripete
+21:54 <@valhalla> ovvero, potremmo dire zero o più ripetizioni del carattere 'a' con ``a*``
+21:55 <@valhalla> che è soddisfato dalle stringhe ``a``, ``aaaaa``, ``aaaaaaaaaaaaa``, ma non da ``bbbbbb``
+21:55 <@valhalla> e poi possiamo comporlo col carattere ``.``, che vuol dire "qualsiasi carattere"
+21:56 <@valhalla> altri due caratteri utili nelle espressioni regolari sono ``^`` che indica l'inizio della riga e ``$`` che indica la fine della riga
+21:56 <@valhalla> risultato, se noi vogliamo cercare tutte le righe che iniziano per `` seguiti dal nome di un comando, seguito da (1), seguito da ``, possiamo usare:
+21:56 <@valhalla> ``grep '^``.*(1)``$' ../../lezione_?/dispensa.rst
+21:57 <@valhalla> e con questo (che eventualmente possiamo passare a less aggiungendo in fondo ``| less`` per leggerlo meglio abbiam trovato tutti i comandi di cui si è parlato nel corso
+21:57 <@valhalla> domande?
+21:57 <@diego71> < JulesX> numero di riga è possibile averlo ?
+21:58 <@valhalla> sì, usando l'opzione -n: ``grep -n '(1)``$' ../../lezione_?/dispensa.rst``
+21:58 <@valhalla> altre domande?
+22:00 <@valhalla> (vedo che l'ultima riga mi son persa dei pezzi di copincolla, il comando è ``grep '^``.*(1)``$' ../../lezione_?/dispensa.rst``
+22:00 <@diego71> < JulesX> spiegheresti bene la sintassi dell'ultimo comando
+22:01 <@valhalla> allora, la prima ed ultima parte sono facili, comando e file su cui cercare :)
+22:01 <@valhalla> in mezzo, tra gli '' c'è l'espressione regolare, protetta con '' perché altrimenti la shell farebbe macello dei contenuti, che son pieni di caratteri che per la shell sono speciali
+22:01 <@valhalla> il primo carattere dell'espressione regolare è ^, che vuol dire "inizio della riga"
+22:02 <@valhalla> poi viene ``, che sono due caratteri che so esserci nelle dispense prima di tutti i nomi di comando
+22:02 <@valhalla> poi c'è .*, che significa "qualunque carattere, ripetuto zero o pi`u volte:
+22:03 <@valhalla> poi di nuovo dei caratteri specifici che so essere letteralmente presenti nel file: (1)``
+22:03 <@valhalla> e infine $, per dire "fine della riga:
+22:03 <@valhalla> cosa che non ho detto, ma è utile dire: grep lavora sulle righe, dall'inizio fino al ritorno a capo
+22:04 <@valhalla> non è banale fare ricerche che comprendano testo a cavallo tra le righe
+22:04 <@valhalla> altre domande?
+22:04 <@valhalla> (e sì, lo so, potevo fare un esempio più facile: questo lo era, poi ho cambiato il formato delle dispense e la versione facile non funzionava più, sorry O:-) )
+22:04 <@diego71> < polva> non ho capito la differenza tra ripetizioni e caratteri. In questo caso tra "?" e "."
+22:05 <@valhalla> il significato di *, ? ecc. è diverso tra il globbing (usato dalla shell e da find) e le espressioni regolari
+22:05 <@valhalla> nelle espressioni regolari, ? e * si riferiscono al carattere che li precede immediatamente
+22:06 <@valhalla> quindi per dire "qualunque carattere, qualunque numero di volte" si deve usare il carattere che vuol dire "qualunque carattere", che è "."
+22:06 <@valhalla> e poi metterci il numero di volte, che è "*" (o ? per zero o una ripetizione soltanto)
+22:07 <@diego71> erio> ma . e * non danno lo stesso risultato ?
+22:08 <@valhalla> no, "." significa soltanto "qualunque carattere"
+22:08 <@valhalla> ad esempio l'espressione regolare asd.qwe è soddisfatta da asdxqwe, ma non da asdxxxxxqwe
+22:08 <@valhalla> invece asd.*qwe è soddisfatta da entrambe, dato che puoi avere qualunque numero di ripetizioni
+22:09 <@valhalla> se invece si mette l'asterisco da solo, asd*qwe in realt`a l'asterisco si riferisce alla "d" che lo precede
+22:09 <@valhalla> quindi va bene "asddddddddqwe", ma non pi`u "asdxqwe"
+22:09 <@valhalla> altre domande?
+22:09 <@diego71> < tiziano> "non è banale fare ricerche che comprendano testo a cavallo tra le righe", ma è possibile (con grep)oppure no?
+22:10 <@valhalla> *solo* con grep no, si possono usare dei programmi che tolgano i cambi di riga, e poi dare il risultato in pasto a grep tramite dei |
+22:10 <@valhalla> per`o di solito diventa un casino ottenere risultati leggibili, in molti casi
+22:10 <@valhalla> altre domande?
+22:11 <@diego71> < gioque> ma $ significa fine della riga che sto cercando? cioè se grep cerca sulla riga a cosa serve $ ??
+22:11 <@valhalla> $ serve per dire che non si vuole nient'altro tra l'ultimo carattere scritto e la fine della riga
+22:12 <@valhalla> se ad esempio si tolgono ^ e $ dall'espressione di prima, ``grep '``.*(1)``' ../../lezione_?/dispensa.rst`` si trova anche la riga 128 di ../../lezione_1/dispensa.rst
+22:13 <@valhalla> che dice "Comandi principali di ``less(1)``"
+22:13 <@valhalla> ovvero, non c'è solo "``less(1)``" su quella riga, ma anche dell'altro testo attorno
+22:13 <@valhalla> (e noi non volevamo questo caso)
+22:13 <@valhalla> altre domande?
+22:15 <@valhalla> nel caso in cui le espressioni regolari vi sembrino ostiche, se pu`o consolare c'è un detto:
+22:15 <@valhalla> 'Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.'
+22:15 <@valhalla> per i casi semplici basta farci la mano e alla fin fine si capisce cosa vogliono dire
+22:16 <@valhalla> ma ci si deve fare la mano facendo tante prove
+22:16 <@valhalla> altre domande?
+22:16 -!- aldagaau [~Alain@host212-195-dynamic.41-79-r.retail.telecomitalia.it] has quit [Quit: Sto andando via]
+22:16 <@diego71> < polva> quindi si potrebbe continuare ad inserire condizioni prima della $ oppure si deve fare un altro "|grep"?
+22:17 <@valhalla> polva: dipende da che condizioni si vogliono inserire, s`i, in molti casi è possibile unire tutto in un espressione regolare unica
+22:17 <@valhalla> in altri casi, diventa pi`u leggibile passare il risutlato ad un altro grep tramite una pipe
+22:17 <@diego71> < polva> e, ditemi se sbaglio, ^ e $ vanno usati sempre l'uno insieme all'altro? o si può fare un uso distaccato?
+22:18 <@valhalla> sono totalmente indipendenti, si possono usare o l'uno o l'altro senza problemi
+22:19 <@valhalla> gli argomenti della serata sono finiti, quindi se avete altre domande chiedete pure
+22:24 <@valhalla> se non ci sono altre domande io chiudo e preparo i log da pubblicare
diff --git a/src/corsi/2014-linea_di_comando/log-lezione_5.log b/src/corsi/2014-linea_di_comando/log-lezione_5.log
new file mode 100644
index 0000000..27b479f
--- /dev/null
+++ b/src/corsi/2014-linea_di_comando/log-lezione_5.log
@@ -0,0 +1,155 @@
+21:03 <@valhalla> Ciao a tutti, benvenuto alla quinta lezione del corso sulla riga di comando
+21:03 <@valhalla> come al solito, spostarsi sulla directory delle altre volte con cd, pwd ed ls per controllare, e poi si pu`o scaricare il materiale di stasera
+21:03 <@valhalla> wget http://www.lifolab.org/corsi/2014-linea_di_comando/riga_di_comando-lezione_5.tar.xz
+21:03 <@valhalla> e poi scompattarlo con tar -x -v -f riga_di_comando-lezione_5.tar.xz
+21:05 <@valhalla> come al solito, se ci sono domande si possono fare sul canale #lifo-comande
+21:05 <@valhalla> ehm
+21:05 <@valhalla> #lifo-domande
+21:06 <@valhalla> dove c'è diego71 che le riporta qui in canale (o se avete qualche problema vi aiuta direttamente a risolverlo)
+21:07 <@valhalla> l'argomento di stasera è "cercare le cose"
+21:09 <@valhalla> negli ultimi anni si sono diffuse un sacco di soluzioni (specialmente da interfaccia grafica) per indicizzare i file e poi ritrovarli, ma stasera parliamo dei due tool base forniti dall'interfaccia testuale per cercare file (find) e per cercare nei contenuti dei file
+21:09 <@valhalla> innanzitutto, prepariamo l'ambiente: ``cd lezione_5`` ``mkdir esercizi`` ``cd esercizi``
+21:09 <@valhalla> a questo punto, possiamo ricordare che già nella prima lezione avevamo parlato di caratteri speciali per indicare pi`u file con una stringa sola
+21:10 <@valhalla> ad esempio, ``ls ../../lezione_?`` vi elenca i contenuti di tutte le directory col nome che inizia per ../../lezione_ seguito da un solo carattere
+21:11 <@valhalla> questo è parte del cosiddetto "globbing", ovvero una sintassi abbastanza semplice per specificare più stringhe in base ad un pattern che queste rispettano
+21:12 <@valhalla> l'altro carattere molto usato che avevamo visto è ``*``, che indica zero o pi`u caratteri qualsiasi
+21:12 <@valhalla> (qui c'è un errore nelle dispense, dove ho scritto uno o più, invece vale anche zero caratteri)
+21:13 <@valhalla> ad esempio, prepariamoci un po' di file con ``touch file_uno file_due file_tre file_quattro cinque``, che crea un po' di file vuoti
+21:13 <@valhalla> ``ls`` per vedere cosa c'è, e poi ``ls file_*`` che vedremo stamperà solo ``file_uno file_due file_tre file_quattro``, ma non ``cinque``
+21:14 <@valhalla> possiamo anche vedere tutti i file con un numero da tre caratteri, con ``ls file_???``
+21:14 <@valhalla> (quindi né file_quattro, né cinque)
+21:16 <@valhalla> questo globbing viene effettuato direttamente dalla shell, che poi passa ai programmi l'elenco dei file che soddisfacevano i requisiti
+21:16 <@valhalla> ci sono domande fin qui?
+21:17 <@valhalla> ovviamente, elencare file in questo modo non è molto utile ai fini del trovare qualcosa che non sappiamo dove sia :)
+21:17 <@valhalla> a questo viene in aiuto il comando find
+21:19 <@valhalla> find è un comando che ha una sintassi leggermente diversa dal solito, e a volte fa uso di magia nera, ma serve per trovare sul filesystem dei file che soddisfano determinate condizioni nei *metadata*
+21:20 <@valhalla> ovvero, può fare ricerche sul nome, sul tipo di file, sulla data, proprietario, dimensioni e quant'altro, ma non sui contenuti
+21:20 <@valhalla> la sintassi è ``find $DOVE_CERCARE $COSA_CERCARE``
+21:21 <@valhalla> dove $COSA_CERCARE è composto da varie opzioni -nome_opzione valore
+21:21 <@valhalla> ad esempio, diamo il comando ``touch file_une``
+21:22 <@valhalla> e poi ``find ../../ -name "file_un?"
+21:22 <@valhalla> notare le ": servono perché vogliamo che sia find a leggere quel ?, non vogliamo che venga interpretato dalla bash
+21:23 <@valhalla> se non avessimo messo le virgolette, ``find ../../ -name file_un?`` sarebbe stato trasformato in ``find ../../ -name file_une file_uno``, che non è quello che vogliamo (e da errore)
+21:23 <@valhalla> quel comando trova nella directory ../../ tutti i file il cui nome è ``file_un`` seguito da un carattere qualsiasi, e niente altro
+21:24 <@valhalla> se usiamo ad esempio ``find ../../ -name "file_u?"`` non troverà niente, mentre nel nostro caso specifico ``find ../../ -name "file_u??" troverà gli stessi file
+21:24 <@valhalla> domande fin qui?
+21:24 <@valhalla> direi di no, proseguo
+21:25 <@valhalla> un altra condizione che ogni tanto si usa sono le dimensioni, ad esempio ``find ../../ -size 1504c`` trova tutti i file che occupano esattamente 1504 byte
+21:26 <@valhalla> il suffisso ``c`` sta per byte, ci sono anche k, M e G che stanno più intuitivamente per kilobyte, megabyte e gigabyte
+21:27 <@valhalla> (può essere utile ad esempio per trovare file da esattamente 2G, che probabilmente son stati troncati su qualche filesystem primitivo :)
+21:28 <@valhalla> per il nome, dimenticavo, c'è anche la variante -iname, che cerca il nome ignorando maiuscole e minuscole
+21:28 <@valhalla> e poi ci sono millemila altre opzioni, che si trovano sulla pagina di manuale
+21:29 <@valhalla> domande fin qui?
+21:29 <@diego71> < tiziano> perché find ../../ e non find . (directory corrente)?
+21:29 <@valhalla> perché così trovava anche riga_di_comando-lezione_5.tar.xz che è quello di cui avevo controllato le dimensioni :)
+21:30 <@valhalla> effettivamente più spesso lo si fa o sulla directory corrente oppure su qualche directory "famosa"
+21:30 <@valhalla> tipo ``find /home -size +128M`` per trovare che utenti di un sistema stanno sprecando spazio :D
+21:31 <@valhalla> altre domande?
+21:31 <@valhalla> (ovvero, trovare i file nelle directory sotto ``/home`` che occupano più di 128 MB
+21:32 <@diego71> riassumo la domanda di gioque: differenze tra find e locate
+21:33 <@valhalla> locate tiene un indice di tutti i nomi di file che c'erano sul filesystem quando ha fatto ha fatto la passata di indicizzazione
+21:34 <@valhalla> di solito i sistemi sono configurati (tramite cron, che per`o qui è un po' OT) per fare quella passata ogni giorno o ogni settimana, ma se si è aggiunto qualcosa di più recente non lo trova
+21:35 <@valhalla> find invece legge i contenuti del disco nel momento in cui lo si lancia, e quindi è in generale pi`u lento, ma permette anche di trovare file recenti e di usare criteri diversi dal nome del file
+21:35 <@valhalla> altre domande?
+21:36 <@valhalla> < polva> non c'è quindi un modo per trovare file con un range di dimensione?
+21:36 <@valhalla> usando due volte -size, una volta con +$DIMENSIONE_MINIMA ed una volta con -$DIMENSIONE_MASSIMA
+21:37 <@valhalla> altre domande?
+21:37 <@diego71> < tiziano> posso usera find per cercare solo directories rispondenti a determinati criteri?
+21:38 <@valhalla> uno dei criteri può essere -type d per dire che quello che vuoi trovare deve essere una directory
+21:38 <@valhalla> (oppure -type f per un file regolare, o -type l per un link simbolico)
+21:38 <@valhalla> poi dipende da cosa vuoi come "determinati criteri"
+21:38 <@valhalla> altre domande?
+21:39 <@valhalla> un'altra cosa che find può fare è agire sui file trovati
+21:39 <@valhalla> non vi faccio esempi dell'opzione -delete, con la quale è mooooolto facile fare danni
+21:40 <@valhalla> ma si pu`o eseguire un comando su ciascuno dei file trovati usando l'opzione ``-exec``:
+21:40 <@valhalla> ``find ../../ -size 1504 -exec /bin/ls -l {} \;
+21:40 <@valhalla> dove dopo exec tutto viene interpretato come il comando da eseguire fino a che non si arriva a \;
+21:41 <@valhalla> e al posto di {} andrà il nome del file che è stato trovato
+21:41 <@valhalla> in questo caso ho usato un comando che non fa danni, ovviamente il rischio di distruggere dati c'è anche qui, se si usa il comando sbagliato
+21:41 <@valhalla> domande?
+21:42 <@diego71> < aldagaau> find /home/ -size +128M -150M (da un errore find: Argomento "$" non valido per -size
+21:42 <@valhalla> ``find ../../ -size -100c -size +10c``
+21:42 <@valhalla> ci vuole due volte l'opzione -size
+21:44 <@valhalla> (nel comando di prima, ho dimenticato c per la dimensione in byte, come era prima non trovava nessun file)
+21:44 <@valhalla> (quello giusto è ``find ../../ -size 1504c -exec /bin/ls -l {} \;``
+21:45 <@diego71> < tiziano> $ find /home -type d -size +128M #cosa c'è di sbagliato in questo comando?
+21:45 <@valhalla> che le directory hanno sempre come dimensione 4096 byte o qualche valore simile (dipende dal filesystem)
+21:45 <@valhalla> i *contenuti* della directory hanno una dimensione ben diversa, ma non è quello su cui find lavor
+21:45 <@valhalla> a
+21:46 <@valhalla> altre domande?
+21:46 <@valhalla> leggo che ci sono problemi con la sintassi di find: se vi state chiedendo se è magia nera, s`i, lo è :)
+21:47 <@valhalla> è ancora pi`u pignolo della media dei programmi da riga di comando, ed ha una fraccata di opzioni anche esoteriche
+21:47 <@valhalla> se non ci sono altre domande, proseguo
+21:48 <@valhalla> con find si cerca tra i metadata dei file, per cercare invece sui contenuti dei file di testo esiste grep
+21:48 <@valhalla> grep ha una sintassi che è il contrario di quella di find: ``grep $COSA_CERCARE $FILE_IN_CUI_CERCARE``
+21:49 <@valhalla> e $COSA_CERCARE non è un semplice globbing, ma un espressione regolare
+21:49 <@valhalla> che è potenzialmente pi`u potente e più complicata
+21:49 <@valhalla> un caso semplice che si usa spesso è selezionare tutte le righe di uno o più file che contengano qualche stringa ben specifica
+21:50 <@valhalla> ad esempio ``grep "(1)" ../dispensa.rst`` vi trova tutti i comandi introdotti di cui si parla in questa dispensa
+21:51 <@valhalla> ``grep "(1)" ../../lezione_?/dispensa.rst`` fa più o meno la stessa cosa, in tutte le dispense di questo corso
+21:51 <@valhalla> dove il ? viene interpretato dal globbing della shell, mentre grep cerca semplicemente la stringa "(1)"
+21:52 <@valhalla> grep stampa poi tutta la riga che soddisfa la ricerca
+21:52 <@valhalla> domande?
+21:53 <@valhalla> con il semplice grep "(1)" per`o abbiamo visto che trova anche righe che non c'entrano
+21:53 <@valhalla> possiamo migliorare la cosa usando alcuni dei caratteri delle espressioni regolari
+21:54 <@valhalla> in questo caso, per cercare zero o più caratteri non basta pi`u usare * come prima
+21:54 <@valhalla> ma bisogna dire quale carattere e quante volte si ripete
+21:54 <@valhalla> ovvero, potremmo dire zero o più ripetizioni del carattere 'a' con ``a*``
+21:55 <@valhalla> che è soddisfato dalle stringhe ``a``, ``aaaaa``, ``aaaaaaaaaaaaa``, ma non da ``bbbbbb``
+21:55 <@valhalla> e poi possiamo comporlo col carattere ``.``, che vuol dire "qualsiasi carattere"
+21:56 <@valhalla> altri due caratteri utili nelle espressioni regolari sono ``^`` che indica l'inizio della riga e ``$`` che indica la fine della riga
+21:56 <@valhalla> risultato, se noi vogliamo cercare tutte le righe che iniziano per `` seguiti dal nome di un comando, seguito da (1), seguito da ``, possiamo usare:
+21:56 <@valhalla> ``grep '^``.*(1)``$' ../../lezione_?/dispensa.rst
+21:57 <@valhalla> e con questo (che eventualmente possiamo passare a less aggiungendo in fondo ``| less`` per leggerlo meglio abbiam trovato tutti i comandi di cui si è parlato nel corso
+21:57 <@valhalla> domande?
+21:57 <@diego71> < JulesX> numero di riga è possibile averlo ?
+21:58 <@valhalla> sì, usando l'opzione -n: ``grep -n '(1)``$' ../../lezione_?/dispensa.rst``
+21:58 <@valhalla> altre domande?
+22:00 <@valhalla> (vedo che l'ultima riga mi son persa dei pezzi di copincolla, il comando è ``grep '^``.*(1)``$' ../../lezione_?/dispensa.rst``
+22:00 <@diego71> < JulesX> spiegheresti bene la sintassi dell'ultimo comando
+22:01 <@valhalla> allora, la prima ed ultima parte sono facili, comando e file su cui cercare :)
+22:01 <@valhalla> in mezzo, tra gli '' c'è l'espressione regolare, protetta con '' perché altrimenti la shell farebbe macello dei contenuti, che son pieni di caratteri che per la shell sono speciali
+22:01 <@valhalla> il primo carattere dell'espressione regolare è ^, che vuol dire "inizio della riga"
+22:02 <@valhalla> poi viene ``, che sono due caratteri che so esserci nelle dispense prima di tutti i nomi di comando
+22:02 <@valhalla> poi c'è .*, che significa "qualunque carattere, ripetuto zero o pi`u volte:
+22:03 <@valhalla> poi di nuovo dei caratteri specifici che so essere letteralmente presenti nel file: (1)``
+22:03 <@valhalla> e infine $, per dire "fine della riga:
+22:03 <@valhalla> cosa che non ho detto, ma è utile dire: grep lavora sulle righe, dall'inizio fino al ritorno a capo
+22:04 <@valhalla> non è banale fare ricerche che comprendano testo a cavallo tra le righe
+22:04 <@valhalla> altre domande?
+22:04 <@valhalla> (e sì, lo so, potevo fare un esempio più facile: questo lo era, poi ho cambiato il formato delle dispense e la versione facile non funzionava più, sorry O:-) )
+22:04 <@diego71> < polva> non ho capito la differenza tra ripetizioni e caratteri. In questo caso tra "?" e "."
+22:05 <@valhalla> il significato di *, ? ecc. è diverso tra il globbing (usato dalla shell e da find) e le espressioni regolari
+22:05 <@valhalla> nelle espressioni regolari, ? e * si riferiscono al carattere che li precede immediatamente
+22:06 <@valhalla> quindi per dire "qualunque carattere, qualunque numero di volte" si deve usare il carattere che vuol dire "qualunque carattere", che è "."
+22:06 <@valhalla> e poi metterci il numero di volte, che è "*" (o ? per zero o una ripetizione soltanto)
+22:07 <@diego71> erio> ma . e * non danno lo stesso risultato ?
+22:08 <@valhalla> no, "." significa soltanto "qualunque carattere"
+22:08 <@valhalla> ad esempio l'espressione regolare asd.qwe è soddisfatta da asdxqwe, ma non da asdxxxxxqwe
+22:08 <@valhalla> invece asd.*qwe è soddisfatta da entrambe, dato che puoi avere qualunque numero di ripetizioni
+22:09 <@valhalla> se invece si mette l'asterisco da solo, asd*qwe in realt`a l'asterisco si riferisce alla "d" che lo precede
+22:09 <@valhalla> quindi va bene "asddddddddqwe", ma non pi`u "asdxqwe"
+22:09 <@valhalla> altre domande?
+22:09 <@diego71> < tiziano> "non è banale fare ricerche che comprendano testo a cavallo tra le righe", ma è possibile (con grep)oppure no?
+22:10 <@valhalla> *solo* con grep no, si possono usare dei programmi che tolgano i cambi di riga, e poi dare il risultato in pasto a grep tramite dei |
+22:10 <@valhalla> per`o di solito diventa un casino ottenere risultati leggibili, in molti casi
+22:10 <@valhalla> altre domande?
+22:11 <@diego71> < gioque> ma $ significa fine della riga che sto cercando? cioè se grep cerca sulla riga a cosa serve $ ??
+22:11 <@valhalla> $ serve per dire che non si vuole nient'altro tra l'ultimo carattere scritto e la fine della riga
+22:12 <@valhalla> se ad esempio si tolgono ^ e $ dall'espressione di prima, ``grep '``.*(1)``' ../../lezione_?/dispensa.rst`` si trova anche la riga 128 di ../../lezione_1/dispensa.rst
+22:13 <@valhalla> che dice "Comandi principali di ``less(1)``"
+22:13 <@valhalla> ovvero, non c'è solo "``less(1)``" su quella riga, ma anche dell'altro testo attorno
+22:13 <@valhalla> (e noi non volevamo questo caso)
+22:13 <@valhalla> altre domande?
+22:15 <@valhalla> nel caso in cui le espressioni regolari vi sembrino ostiche, se pu`o consolare c'è un detto:
+22:15 <@valhalla> 'Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.'
+22:15 <@valhalla> per i casi semplici basta farci la mano e alla fin fine si capisce cosa vogliono dire
+22:16 <@valhalla> ma ci si deve fare la mano facendo tante prove
+22:16 <@valhalla> altre domande?
+22:16 <@diego71> < polva> quindi si potrebbe continuare ad inserire condizioni prima della $ oppure si deve fare un altro "|grep"?
+22:17 <@valhalla> polva: dipende da che condizioni si vogliono inserire, s`i, in molti casi è possibile unire tutto in un espressione regolare unica
+22:17 <@valhalla> in altri casi, diventa pi`u leggibile passare il risutlato ad un altro grep tramite una pipe
+22:17 <@diego71> < polva> e, ditemi se sbaglio, ^ e $ vanno usati sempre l'uno insieme all'altro? o si può fare un uso distaccato?
+22:18 <@valhalla> sono totalmente indipendenti, si possono usare o l'uno o l'altro senza problemi
+22:19 <@valhalla> gli argomenti della serata sono finiti, quindi se avete altre domande chiedete pure
+22:24 <@valhalla> se non ci sono altre domande io chiudo e preparo i log da pubblicare