Comandi avanzati
Salvatore Campagna
Email: [email protected]
Politecnico di Torino
Dipartimento di Automatica e Informatica
Il comando find
Il comando find cerca file in una gerarchia
di directory
 Sintassi: find <directory> <espressione>

◦ <espressione> è un insieme di opzioni, test e
azioni
◦ Le opzioni hanno effetto su tutti i file
globalmente
◦ I test e le azioni sono eseguiti file per file
Il comando find

Le opzioni più importanti sono:
◦ -name <pattern>: seleziona i file con nome
che soddisfa il pattern specificato
◦ -perm <mask>: seleziona i file con determinati
permessi (rappresentazione ottale)
◦ -size <[+|-]n[ckM]>: selziona i file di
dimensione n
◦ -type <type>: seleziona i file in base al tipo.
type=d directory, type=f file, type=l link
◦ -user <user>: seleziona i file dell’utente
specificato
Il comando find
-links <n>: seleziona i file con n link
 -ls: produce un formato simile al formato
esteso di ls
 -maxdepth <n>: scende ricorsivamente
nelle directory al massimo fino al livello n
(rispetto al corrente livello)
 -mindepth <n>: scende ricorsivamente
nelle directory almeno fino al livello n
(rispetto al corrente)

Il comando find

Esempi:
◦
◦
◦
◦
◦
◦
◦
find
find –ls
find /home –name ‘’test’’
find . –size +10k
find /usr/bin –perm 444 –u alice
find –type d
find –maxdepth 1 –mindepth 1
Il comando find


L’opzione –exec permette di eseguire una
certa azione su tutti i file selezionati da find
Sintassi: find <dir> <opzioni> -exec comando
argomenti ‘{ }’ \;
◦ comando è un comando eseguito su ciascun file
◦ argomenti sono gli argomenti da passare al
comando
◦ ‘{}’ viene sostituito da file selezionati in modo che
il comando operi su di essi
◦ ; segnala la fine dei parametri per l’opzione exec
Il comando find

Esempi
◦ find . -type f -exec file {} \;
◦ find . –perm 664 –exec chmod u+x ‘{ }’ \;
◦ find . –type f –name “*.bak” –exec mv ‘{ }’
backup/ \;
Gestione dei processi
Quando viene impartito un comando la
shell lancia il processo che lo esegue e
attende la sua terminazione
 E’ possibile avviare o fermare l’esecuzione
di un processo e in più sospendere e
riprendere
 Si possono eseguire più processi
concorrenti lanciandoli in background
 Sintassi: comando &

Gestione dei processi
I processi si possono sospendere con la
combinazione CTRL-Z (sospendere non
vuol dire terminare)
 Il comando fg [jobid] porta in foreground
il comando rendendolo il comando
corrente
 Il comando bg [jobid] mette il comando in
background come se fosse stato avviato
con ‘&’

Gestione dei processi
comando
shell
RUN
foreground
comando &
ctrl-z
fg
fg
STOPPED
bg
RUN
background
Gestione dei processi
jobs: elenca i job
 bg %<jobid>: porta in background il job
identificato da jobid
 fg %<jobid>: porta in foreground il job
identificato da jobid
 kill -9 <jobpid>: invia un segnale che
termina il processo con pid specificato
 ps: elenca i processi con i relativi dettagli

Makefile
Obiettivo: dato un insieme di file sorgente
determinare se e quali file devono essere
ricompilati per generare un file
oggetto/exeguibile
 I makefile descrivono i legami tra file
(dipendenze) e riportano i comandi da
eseguire per aggiornare gli eseguibili
 Utilizza la data di ultima modifica per
decidere se ricompilare un eseguibile

Makefile

Esempio:
1. main.o: main.c main.h
<TAB>gcc –c main.c –o main.o
2. main.exe: main.o
<TAB>gcc main.o –o main.exe
3. clean:
<TAB>rm –rf *.o $(EXEC)
Makefile
E’possibile dichiarare variabili
 Esempi:

◦
◦
◦
◦
CC=gcc
CFLAGS=-Wall
SRCS=main.c mylib.c
HEADERS=main.h mylib.h
E scrivere poi:
 main.exe: $(SRCS) $(HEADERS)

<TAB>$(CC) $(CFLAGS) $(SRCS) –o main.exe
Makefile
Se il file si chiama GNUMakefile o
makefile oppure Makefile basta invocare
make
 Altriemnti make –f <makefile>
 Si può specificare un target lanciando
make <target>

◦ Esempio: make main.o per eseguire solamente
il comando associato al target main.o
Occupazione di spazio su disco
I comandi df e du permettono di ottenere
informazioni riguardo l’occupazione di
spazio su disco
 Spazio libero: df [-k] [disco]

◦ -k: spazio in Kbyte

Spazio occupato: du [-aks] <directory>
◦ -a: occupazione per file
◦ -s: solo occupazione totale
◦ -k: occupazione in Kbyte
Cut
Cut divide ogni riga di un file in più campi
 cut [opzioni] [file]
 Opzioni utili

◦ -f num: specifica il numero di campo da
scrivere su standard output
◦ -d delim: usa il delimitatore specificato per
separare i vari campi

Esempio: cut –f2 –d:
Uniq
Elimina occorrenze adiacenti e ripetute di
una riga di file
 Senza opzioni le righe ripetute vengono
«collassate» in una sola riga
 uniq [opzioni] [file]
 Opzioni utili:

◦
◦
◦
◦
◦
-c: precede ogni riga col numero di occorrenze
-d: visualizza solo righe ripetute
-f num: evita il confronto dei primi num campi
-i: ignora maiuscole e minuscole
-u: visualizza solo righe uniche
Sort
Visualizza il risultato dell’ordinamento dei file passati
come argomento
 sort [opzioni] [file]
 Opzioni utili:

◦ -d: ordinamento ‘dizionario’ (considera solo spazi e
caratteri alfanumerici)
◦ -f: ignora maiuscole e minuscole
◦ -M: ordinamento mensile
◦ -n: ordinamento numerico
◦ -R: ordinamento random
◦ -r: inverte l’ordinamento
◦ -kPOS1,POS2: ordina in base al campo individuato da
POS1 e POS2
◦ -d delim: specifica il separatore di campo
Sort

Esempio:
◦ sort –k3 –d: -r –M testfile.txt
◦ divide ogni riga del file testfile.txt in campi
separati da ‘:’ e opera un ordinamento menisle
(-M) invertito (-r) sul campo numero 3 (-k=3)
Espressioni regolari
Utilizzate per individuare testo con un
certo criterio
 Esempio: tutte le righe che comniciano
con un certo carattere o che contengono
una certa parola
 Utilizzano dei caratteri speciali per
individuare il testo

Espressioni regolari

Caratteri speciali
◦
◦
◦
◦
‘^’ match dell’inizio di una riga di testo
‘$’ match dellla fine di una riga di testo
‘.’ match di un singolo carattere (qualsiasi)
‘*’ match zero o più occorrenze del carattere
precedente
◦ ‘[]’ match di tutti i caratteri al suo interno
Espressioni regolari


Si specificano tra //
Esempi:
◦
◦
◦
◦
/./: match righe con almeno un carattere
/a.*b/: match di ‘ab’, ‘acb’, ‘abdfb’, ecc...
/^#/: match righe che cominciano con ‘#’
/} *$/: match delle righe che terminano con una
parentesi seguita da zero o più spazi
◦ /[a-z]*/: match di una parola con caratteri
minuscoli
◦ /[Ss]istemi/: match di ‘Sistemi’ oppure ‘sistemi’
◦ /[1-9][0-9]*/: match di un numero decimale
Grep
Grep visualizza le righe di un file che
rispettano (match) un certo formato
(pattern)
 grep [opzioni] pattern [file]
 Il pattern può essere una espressione
regolare

Grep

Opzioni utili
◦
◦
◦
◦
◦
◦
-c: stampa il numero di righe con un match
-f file: legge il pattern da cercare da file
-h: elimina il nome del file in cui si ha il match
-H: visualizza il nome del file per ogni match
-i: ignora maiuscole/minuscole
-n: precedi ogni linea di output con il numero di
riga in cui si ha il match
◦ -v: seleziona le righe che NON soddisfano al
ricerca
◦ -r: opera ricorsivamente su tutti i file
Scripting
Uno script è costituito da un file
contenente un insieme di comandi
 La prima riga ha un formato particolare e
istruisce la shell sull’interprete da
utilizzare per eseguire i comandi

◦ #!/bin/bash
◦ #!/bin/csh
◦ ecc...

Si deve impostare il permesso di
esecuzione
Scripting – If e test
Il costrutto if/then/else test l’exit status di
un comando
 Formato
If [ condizione-vera ]
then
<comando>
else
<comando>
fi

Scripting – If e test
Le parentesi [ ] (sinonimo del comando
test) considerano il comando un
confronto o un test su file
 Esempio
If [ $var = ‘’user’’]
then

echo ‘’Alice è un utente del sistema’’
fi
Scripting – If e test
If [ -e file ]: testa l’esistenza di un file
 If [ -s file ]: testa se un file ha dimensione
maggiore di zero
 If [ -d directory ]: testa l’esistenza di una
directory
 If [ -h link ]: testa se link è un link

Scripting – If e test

Per confrontare variabili con valori interi si usano
speciali operatori:
◦
◦
◦
◦
◦
◦
◦
◦
If [ $var –eq 0 ]: test var == 0
If [ $var –lt 0 ]: test var < 0
If [ $var –gt 0 ]: test var > 0
If [ $var –le ]: test var <= 0
If [ $var –ge ]: test var >= 0
If [ $user == ‘’alice’’ ]: test uguaglianza tra stringhe
If [ $user != ‘’alice’’ ]: test disuguaglianza
If [ ‘’a’’ > ‘’b’’ ] oppure [ ‘’a’’ < ‘’b’’ ]: test precedenza
alfabetica
◦ If [ -n $user ]: test user non è null
Scripting – If e test
Si possono concatenare i test con operatori
logici per eseguire più test
 -a: and
 -o: or
 Esempio: il file esiste e ha dimensione
maggiore di zero
If [ -e file –a –s file ]
then
...
fi

Scripting – Ciclo for
Ciclo for
for arg in list
do

<comandi>
done
 Esempio:
for name in ‘’alice’’ ‘’bob’’ ‘’mike’’
do
echo $name
done
Scripting – Ciclo while

Il ciclo while
while [ condizione ]
do
<comandi>
done
 Esempio
var=0
while [ $var –lt 10 ]
do
echo $var
done
Scripting
Esempio 1: si realizzi uno script che dati in
input una o più directory verifichi
l’esistenza di link orfani in ciascuna delle
directory
 Esempio 2: si realizzi uno script che
visualizzi su standard output l’elenco di
tutti gli utenti esistenti sul sistema

Sed
Sed è un filtro (stream editor)
 Opera trasformazioni sul testo letto da
stdin riga per riga e scrive l’output su
stdout
 Sintassi: sed [opzioni] ‘[comandi]’ [file]
 Opzioni utili:

◦ -f <script>: esegue i comandi sed contenuti
nel file
◦ -n: se specificato visualizza le righe richieste
col comando p (vedi slide seguenti)
Sed
Ogni comando sed è composto da un
address e una istruzione
 Sintassi comando: <address><istruzione>
 Sed opera riga per riga applicando
l’istruzione ad ogni porzione di testo
individuata dall’address
 La riga corrente durante l’esecuzione di
un comando sed prende il nome di
pattern space

Sed
Numero di address
1. 0: se non si specifica l’address sed
esegue l’istruzione su ciascuna riga
2. 1: se si specifica un address sed opera
sulle righe individuate dall’address
3. 2: se si specificano due address sed
opera su tutte le righe comprese tra i
due address

Sed

Come si specificano gli address
◦ Con un range. Esempio: 1,10. Tutte le righe dalla 1
alla 10.
◦ Espressione regolare. L’istruzione opera sulle
righe che soddisfano l’espressione regolare
(specificata tra ‘//’)
◦ Con $. L’istruzione opera sull’ultima riga
◦ Con un numero. Il numero è interpretato come
numero di riga su cui eseguire l’istruzione
◦ num~step: a partire dalla riga num ogni step righe.
Esempio: 1~3 dalla prima riga ogni 3
Sed

Istruzioni diverse a seconda del numero
di address:
◦ 0 oppure 1 address:
 =: stampa il numero di riga
 q: termina l’elaborazione
◦ Esempi:
 cat Makefile | sed ‘=‘ (stampa numero riga)
Sed
◦ 1 oppure 2 address:
 d: cancella la riga (1 address) o il testo compreso (2
address)
 p: stampa il pattern space (riga corrente su cui
opera il comando)
 s/regexp/replacement/flag: sostituisce regexp con
replacement
 flag: numero, p oppure g
 y/charset1/charset2/: sostituisce i caratteri in
charset1 con i correspondenti caratteri in charset2
Sed

Esempi:
 cat Makefile | sed ‘/^#/d’ (cancella i commenti)
 cat Makefile | sed –n ‘3,$p’ (visualizza le righe dalla
terza alla fine del file)
 cat Makefile | sed ‘s/main/prog/g’ (sostituisce tutte le
occorrenze di main con prog)
 cat Makefile | sed ‘y/m/M/’ (sostituisce tutte le
occorrenze di ‘m’ com ‘M’)
 cat Makefile | sed ‘/^clean/,$ s/rm/rm -i/g’
(sostituisce tutte le occorrenze di rm con rm –i a
partire dalla rig che comincia con clean fino alla fine
del file)
Sed
Esercizio 1: Scrivere un comando sed che
legga da stdin un numero esadecimale
(preceduto da 0x) e visualizzi in output il
numero binario corrispondente
 Esercizio 2: Cosa fa il seguente comando?

◦ sed '/g/s/g/s/g‘

Esercizio 3: scrivere un comando sed che
chiamato su un file C contenente la
funzione main ne visualizzi il contenuto
(solo della funzione main)
Scarica

Slide - Politecnico di Torino