103.3 Lezione 2
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
103 Comandi GNU e Unix |
Obiettivo: |
103.3 Eseguire la gestione base sui file |
Lezione: |
2 di 2 |
Introduzione
Come Ricercare File
Man mano che si utilizza la macchina, i file crescono progressivamente in numero e dimensione. A volte diventa difficile individuare un particolare file. Fortunatamente Linux fornisce find
per cercare e individuare rapidamente i file. find
utilizza la seguente sintassi:
find STARTING_PATH OPTIONS EXPRESSION
STARTING_PATH
-
definisce la directory in cui inizia la ricerca.
OPTIONS
-
controlla il comportamento e aggiunge criteri specifici per ottimizzare il processo di ricerca.
EXPRESSION
-
definisce la query di ricerca.
$ find . -name "myfile.txt" ./myfile.txt
Il percorso iniziale in questo caso è la directory corrente. L’opzione -name
specifica che la ricerca è basata sul nome del file. myfile.txt
è il nome del file da cercare. Quando si utilizza il globbing dei file, assicurarsi di includere l’espressione tra virgolette:
$ find /home/frank -name "*.png" /home/frank/Pictures/logo.png /home/frank/screenshot.png
Questo comando trova tutti i file che terminano con .png
a partire dalla directory /home/frank/
. L’uso dell’asterisco (*
) è stato trattato in una lezione precedente
Utilizzo dei Criteri per Velocizzare la Ricerca
Usa find
per individuare i file in base a type, size o time. Specificando una o più opzioni, i risultati desiderati si ottengono in minor tempo.
Le opzioni per la ricerca di file in base al tipo includono:
-type f
-
ricerca di file.
-type d
-
ricerca di directory.
-type l
-
ricerca di link simbolici.
$ find . -type d -name "example"
Questo comando trova tutte le directory, nella directory corrente e sottostanti, che hanno il nome example
.
Altri criteri che potrebbero essere usati con find
includono:
-name
-
esegue una ricerca basata sul nome dato.
-iname
-
effettua la ricerca in base al nome non considerando maiscole e minuscole (
myFile
diventa uguale aMYFILE
). -not
-
restituisce quei risultati che non corrispondono allo scenario di test.
-maxdepth N
-
ricerca nella directory corrente così come nelle sottodirectory a
N
livelli sottostanti.
Individuazione dei File in Base all’Ora di Modifica
find
permette anche di filtrare una gerarchia di directory in base a quando il file è stato modificato:
$ sudo find / -name "*.conf" -mtime 7 /etc/logrotate.conf
Questo comando cercherà tutti i file nell’intero file system (il percorso iniziale è la directory principale, cioè /
) che terminano con i caratteri .conf
e sono stati modificati negli ultimi sette giorni. Questo comando richiede privilegi elevati per accedere a tutte le directory a partire dalla base della struttura delle directory del sistema, da qui l’uso di sudo
. L’argomento passato a mtime
rappresenta il numero di giorni dall’ultima modifica del file.
Individuazione dei File per Dimensione
find
può anche individuare i file per dimensione. Per esempio, cercando file più grandi di 2G
in / var
:
$ sudo find /var -size +2G /var/lib/libvirt/images/debian10.qcow2 /var/lib/libvirt/images/rhel8.qcow2
L’opzione -size
mostra i file di dimensioni corrispondenti all’argomento passato. Alcuni argomenti di esempio includono:
-size 100b
-
file che sono esattamente di 100 byte.
-size +100k
-
file più grandi di 100 kilobyte.
-size -20M
-
file di dimensioni inferiori a 20 megabyte.
-size + 2G
-
file più grandi di 2 gigabyte.
Note
|
Per trovare file vuoti possiamo usare: |
Agire sul Set di Risultati
Una volta terminata la ricerca, è possibile eseguire un’azione sull’insieme risultante usando -exec
:
$ find . -name "*.conf" -exec chmod 644 '{}' \;
Questo comando filtra ogni oggetto nella directory corrente (.
) e sottostanti per i nomi di file che terminano con .conf
; successivamente esegue chmod 644
per modificare i permessi degli stessi file.
Per ora, non preoccuparti del significato di '{}' \;
perchè verrà discusso più avanti.
Usare grep
per filtrare i file in base al contenuto
grep
viene utilizzato per cercare una o più occorrenze di una parola chiave.
Considera una situazione in cui dobbiamo trovare file in base al contenuto:
$ find . -type f -exec grep "lpi" '{}' \; -print ./.bash_history Alpine/M helping/M
Questo comando cercherà ogni oggetto nella gerarchia di directory corrente (.
) che è un file (-type f
) e quindi esegue il comando grep "lpi"
per ogni file che soddisfa le condizioni. I file che soddisfano queste condizioni vengono visualizzati sullo schermo (-print
). Le parentesi graffe ({}
) sono un segnaposto per i risultati della corrispondenza di find
. I caratteri {}
sono racchiusi tra virgolette singole ('
) per evitare di passare file greppati
con nomi contenenti caratteri speciali. Il comando -exec
termina con un punto e virgola (;
), che dovrebbe essere preceduto dal carattere di escape (\
) per evitare l’interpretazione da parte della shell.
L’aggiunta dell’opzione -delete
alla fine di un’espressione elimina tutti i file che corrispondono: questa opzione dovrebbe essere utilizzata quando si è certi che i risultati corrispondono solo ai file che si desidera eliminare.
Nell’esempio seguente, find
individua tutti i file nella gerarchia a partire dalla directory corrente quindi elimina tutti i file che terminano con i caratteri .bak
:
$ find . -name "*.bak" -delete
Archiviazione di File
Il Comando tar
(Archiviazione e Compressione)
Il comando tar
, abbreviazione di “tape archive(r)”, è usato per creare archivi tar convertendo un gruppo di file in un archivio. Gli archivi vengono creati in modo da spostare o eseguire il backup facilmente di un gruppo di file. Pensa a tar
come a uno strumento che crea un collante su cui i file possono essere allegati, raggruppati e spostati facilmente.
tar
ha anche la capacità di estrarre archivi tar, visualizzare un elenco dei file inclusi nell’archivio e aggiungere file ulteriori a un archivio esistente.
La sintassi del comando tar
è la seguente:
tar [OPERATION_AND_OPTIONS] [ARCHIVE_NAME] [FILE_NAME(S)]
OPERATION
-
È consentito e richiesto una sola operazione alla volta. Le operazioni più utilizzate sono:
--create
(-c
)-
Crea un nuovo archivio tar.
--extract
(-x
)-
Estrae l’intero archivio o uno o più file da un archivio.
--list
(-t
)-
Visualizza un elenco dei file inclusi nell’archivio.
OPTIONS
-
Le opzioni utilizzate più di frequente sono:
--verbose
(-v
)-
Mostra i file elaborati dal comando
tar
. --file=nome-archivio
(-f nome-archivio
)-
Specifica il nome del file di archivio.
ARCHIVE_NAME
-
Il nome dell’archivio.
FILE_NAME(S)
-
Un elenco separato da spazi di nomi di file da estrarre. In caso contrario, viene estratto l’intero archivio.
Creazione di un Archivio
Supponiamo di avere una directory chiamata stuff
nella directory corrente e vogliamo salvarla in un file chiamato archive.tar
. Dovremmo eseguire il seguente comando:
$ tar -cvf archive.tar stuff stuff/ stuff/service.conf
Ecco cosa significano effettivamente queste opzioni:
-c
-
Crea un archivio.
-v
-
Mostra l’avanzamento nel terminale durante la creazione dell’archivio, noto anche come modalità “verbosa”. La
-v
è sempre opzionale in questi comandi, ma utile. -f
-
Permette di specificare il nome del file dell’archivio.
In generale per archiviare una singola directory o un singolo file su Linux, utilizziamo:
tar -cvf NAME-OF-ARCHIVE.tar /PATH/TO/DIRECTORY-OR-FILE
Note
|
|
Per archiviare più directory contemporaneamente, elenchiamo tutte le directory delimitandole da uno spazio nella sezione /PATH/TO/DIRECTORY-OR-FILE
:
$ tar -cvf archive.tar stuff1 stuff2
Questo produrrebbe un archivio di stuff1
e stuff2
in archive.tar
Estrarre un Archivio
Possiamo estrarre un archivio usando tar
:
$ tar -xvf archive.tar stuff/ stuff/service.conf
Questo estrarrà il contenuto di archive.tar
nella directory corrente.
Questo comando è lo stesso del comando di creazione dell’archivio usato sopra, ad eccezione dell’opzione -x
che sostituisce l’opzione -c
.
Per estrarre il contenuto dell’archivio in una directory specifica usiamo -C
:
$ tar -xvf archive.tar -C /tmp
Questo estrarrà il contenuto di archive.tar
nella directory / tmp
.
$ ls /tmp stuff
Comprimere con tar
Il comando GNU tar
incluso con le distribuzioni Linux può creare un archivio .tar
e comprimerlo con la compressione gzip
o bzip2
in un unico comando:
$ tar -czvf name-of-archive.tar.gz stuff
Questo comando creerebbe un file compresso usando l’algoritmo gzip
(-z
).
Sebbene la compressione gzip
sia usata più frequentemente per creare file .tar.gz
o .tgz
, tar
supporta anche la compressione bzip2
. Questo permette la creazione di file compressi bzip2
, spesso chiamati file .tar.bz2
, .tar.bz
o tbz
.
Per farlo, sostituiamo -z
per gzip
con -j
per bzip2
:
$ tar -cjvf name-of-archive.tar.bz stuff
Per decomprimere il file, sostituiamo -c
con -x
, dove x
sta per “extract”:
$ tar -xzvf archive.tar.gz
gzip
è più veloce, ma generalmente comprime un po' meno, quindi si ottiene un file leggermente più grande. bzip2
è più lento, ma comprime un po' di più. In generale, però, gzip
e bzip2
sono praticamente la stessa cosa ed entrambi funzioneranno in modo simile.
In alternativa possiamo applicare la compressione gzip
o bzip2
usando il comando gzip
per le compressioni gzip
e il comando bzip2
per le compressioni bzip
. Per esempio, per applicare la compressione gzip
, usa:
gzip FILE-TO-COMPRESS
gzip
-
crea il file compresso con lo stesso nome ma con un finale
.gz
. gzip
-
rimuove i file originali dopo aver creato il file compresso.
Il comando bzip2
funziona in modo simile.
Per decomprimere i file usiamo gunzip
o bunzip2
a seconda dell’algoritmo usato per comprimere un file.
Il Comando cpio
cpio
sta per “copy in, copy out”. Viene utilizzato per elaborare file di archivio come file \* .cpio
o * .tar
.
cpio
esegue le seguenti operazioni:
-
Copiare file in un archivio.
-
Estrarre file da un archivio.
Prende l’elenco dei file dallo standard input (principalmente l’output da ls
).
Per creare un archivio cpio
, usiamo:
$ ls | cpio -o > archive.cpio
L’opzione -o
dice a cpio
di creare un output. In questo caso, il file di output creato è archive.cpio
. Il comando ls
elenca i contenuti della directory corrente che devono essere archiviati.
Per estrarre l’archivio utilizziamo:
$ cpio -id < archive.cpio
L’opzione -i
viene utilizzata per eseguire l’estrazione. L’opzione -d
creerà cartelle di destinazione se necessario. Il carattere <
rappresenta lo standard input. Il file di input da estrarre è archive.cpio
.
Il Comando dd
dd
copia i dati da una posizione all’altra. La sintassi della riga di comando di dd
è diversa da molti altri programmi Unix, utilizza la sintassi option=value
per le sue opzioni della riga di comando piuttosto che i formati standard GNU -option value
o --option=value
:
$ dd if=oldfile of=newfile
Questo comando copia il contenuto di oldfile
in newfile
, dove if=
è il file di input e of=
si riferisce al file di output.
Note
|
Il comando |
dd
è anche usato per cambiare i dati in maiuscolo/minuscolo o scrivere direttamente su dispositivi a blocchi come /dev/sdb
:
$ dd if=oldfile of=newfile conv=ucase
Questo copierà tutto il contenuto di oldfile
in newfile
e renderà tutto il testo in maiuscolo.
Il comando seguente eseguirà il backup dell’intero disco rigido situato in /dev/sda
in un file chiamato backup.dd
:
$ dd if=/dev/sda of=backup.dd bs=4096
Esercizi Guidati
-
Considera il seguente elenco:
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
Che tipo di file produrrebbe questo comando?
-
In quale directory inizia la ricerca?
-
-
Un utente desidera comprimere la sua cartella di backup. Lui usa il seguente comando:
$ tar cvf /home/frank/backup.tar.gz /home/frank/dir1
Quale opzione manca per comprimere il backup usando l’algoritmo
gzip
?
Esercizi Esplorativi
-
In qualità di amministratore di sistema, è necessario eseguire controlli regolari per rimuovere file voluminosi. Questi file voluminosi si trovano in
/ var
e terminano con un’estensione.backup
.-
Scrivi il comando, usando
find
, per individuare questi file: -
Un’analisi delle dimensioni di questi file rivela che vanno da
100M
a1000M
. Completa il comando precedente con queste nuove informazioni, in modo da poter individuare quei file di backup che vanno da100M
a1000M
: -
Infine, completa questo comando, con l’azione di eliminazione in modo che questi file vengano rimossi:
-
-
Nella directory
/var
, esistono quattro file di backup:db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Utilizzando
tar
, specificare il comando che creerebbe un file di archivio con il nomedb-first-quarter-2018.backup.tar
: -
Usando
tar
, specifica il comando che creerebbe l’archivio e comprimilo usandogzip
. Tieni presente che il nome del file risultante dovrebbe terminare con.gz
:
-
Sommario
In questa lezione abbiamo imparato:
-
Come trovare file con
find
. -
Come aggiungere criteri di ricerca in base all’ora, al tipo di file o alla dimensione fornendo un argomento a
find
. -
Come agire su un set restituito.
-
Come archiviare, comprimere e decomprimere file usando
tar
. -
Elaborazione di archivi con
cpio
. -
Copia di file con
dd
.
Risposte agli Esercizi Guidati
-
Considera il seguente elenco::
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
Che tipo di file produce questo comando?
Directories.
-
In quale directory inizia la ricerca?
/home/frank/Documents
-
-
Un utente desidera comprimere la sua cartella di backup. Lui usa il seguente comando:
$ tar cvf /home/frank/backup.tar.gz /home/frank/dir1
Quale opzione manca per comprimere il backup usando l’algoritmo
gzip
?L’opzione
-z
.
Risposte agli Esercizi Esplorativi
-
In qualità di amministratore di sistema, è necessario eseguire controlli regolari per rimuovere file voluminosi. Questi file voluminosi si trovano in
/ var
e terminano con un’estensione.backup
.-
Scrivi il comando, usando
find
, per individuare questi file:$ find /var -name *.backup
-
Un’analisi delle dimensioni di questi file rivela che vanno da
100M
a1G
. Completa il comando precedente con queste nuove informazioni, in modo da poter individuare quei file di backup che vanno da100M
a1G
:$ find /var -name *.backup -size +100M -size -1G
-
Infine, completa questo comando, con l’azione di eliminazione in modo che questi file vengano rimossi:
$ find /var -name *.backup -size +100M -size -1G -delete
-
-
Nella directory
/var
, esistono quattro file di backup:db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Utilizzando
tar
, specificare il comando che creerebbe un file di archivio con il nomedb-first-quarter-2018.backup.tar
:$ tar -cvf db-first-quarter-2018.backup.tar db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Usando
tar
, specifica il comando che creerebbe l’archivio e comprimilo usandogzip
. Tieni presente che il nome del file risultante dovrebbe terminare con.gz
:$ tar -zcvf db-first-quarter-2018.backup.tar.gz db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-