Corso Linux Base – Lezione 5
Home Directory
Questo è un esempio di un normale file system su Linux:
tree -L 1 /
/
├── bin
├── boot
├── cdrom
├── dev
├── etc
├── home
├── lib
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var
La maggior parte di queste directory sono comuni su tutti i sistemi Linux. Dai server ai supercomputer ai piccoli sistemi embedded, un utente Linux esperto può essere sicuro di poter trovare il comando ls all’interno di /bin, può cambiare la configurazione del sistema modificando i file in /etc e leggere i log di sistema in /var. La posizione standard di questi file e directory è definita dal Filesystem Hierarchy Standard (FHS), che sarà analizzato in una lezione successiva. Imparerai di più sul contenuto di queste directory man mano che continuerai a conoscere Linux, ma per il momento, sappi che le modifiche apportate nel filesystem di root (e quindi in molte delle cartelle indicate sopra come /etc, /bin etc.) interesseranno tutti gli utenti e la modifica dei file nel filesystem di root richiederà le autorizzazioni di amministratore. Ciò significa che agli utenti normali sarà vietato modificare questi file e potrebbe anche essere vietato leggere questi file. Tratteremo l’argomento delle autorizzazioni in una lezione successiva.
Ora, ci concentreremo sulla directory /home, che dovrebbe essere alquanto familiare a questo punto:
$ tree -L 1 /home
/home
├── user
├── michael
└── lara
Il nostro sistema di esempio ha tre utenti normali e ognuno dei nostri utenti ha la propria directory home dedicata, dove possono creare e modificare file e directory senza influire sugli altri utenti. Ad esempio, nella lezione precedente stavamo lavorando con la seguente struttura di file:
$ tree /home/user
user
└── Documents
├── Mission-Statement
└── Reports
└── report2018.txt
In realtà, il contenuto dell’intera cartella home potrebbe assomigliare a questo:
$ tree /home
/home
├── user
│ └── Documents
│ ├── Mission-Statement
│ └── Reports
│ └── report2018.txt
├── michael
│ ├── Documents
│ │ └── presentation-for-clients.odp
│ └── Music
In Linux, /home è simile a un condominio. Molti utenti possono avere il loro spazio qui, separati in appartamenti dedicati. Le utilità e la manutenzione dell’edificio stesso sono di responsabilità dell’utente principale sovrintendente (utente root – amministratore).
Path Relativi speciali per la directory Home
Quando si avvia una nuova sessione di terminale su Linux, viene visualizzato un prompt dei comandi simile al seguente:
user@hostname ~ $
La tilde (~) qui rappresenta la nostra directory home. Se esegui il comando ls, vedrai un output familiare:
$ cd ~
$ ls
Documents
Confrontalo con l’elenco della cartella home visualizzato sopra. Considera ora ciò che sappiamo di Linux: è simile a un condominio, con molti utenti residenti in /home. Quindi la home dell’utente user sarà diversa dalla home dell’utente michael. Per dimostrarlo, useremo il comando su per cambiare utente.
user@hostname ~ $ pwd
/home/user
user@hostname ~ $ su michael
Password:
michael@hostname ~ $ pwd
/home/michael
Il significato di ~ cambia quindi a seconda di chi è l’utente. Per michael, il percorso assoluto di ~ è /home/michael. Per lara, il percorso assoluto di ~ è /home/lara, per l’utente user il percorso assoluto di ~ sarà invece /home/user e così via.
L’uso di ~ per i comandi è molto conveniente, a condizione che non si cambi utente. Considereremo il seguente esempio per l’utente, che ha iniziato una nuova sessione:
$ ls
Documents
$ cd Documents
$ ls
Mission-Statement
Reports
$ cd Reports
$ ls
report2018.txt
$ cd ~
$ ls
Documents
Nota che gli utenti inizieranno sempre una nuova sessione nella loro home directory. In questo esempio, l’utente è passato alla sottodirectory Documents/Reports e con il comando cd ~ è tornato al punto di partenza. È possibile eseguire la stessa azione utilizzando il comando cd senza argomenti:
$ cd Documents/Reports
$ pwd
/home/user/Documents/Reports
$ cd
$ pwd
/home/user
Un’ultima cosa da notare: possiamo specificare le home directory degli altri utenti specificando il nome utente dopo la tilde. Per esempio:
$ ls ~michael
Documents
Music
Nota che questo funzionerà solo se michael ci ha dato il permesso di visualizzare i contenuti della sua home directory. Consideriamo una situazione in cui michael vorrebbe visualizzare il file report2018.txt nella home directory di user. Supponendo che Michael abbia il permesso di farlo, può usare il comando less.
$ less ~user/Documents/Reports/report2018.txt
Qualsiasi percorso di file che contiene il carattere ~ viene chiamato relative-to-home path.
File e directory nascosti
Nella lezione precedente, abbiamo introdotto l’opzione -a per il comando ls. Abbiamo usato ls -a per introdurre i due path relativi speciali: “.” e “..” . L’opzione -a elencherà tutti i file e le directory, inclusi i file e le directory nascosti.
$ ls -a ~
.
..
.bash_history
.bash_logout
.bash-profile
.bashrc
Documents
I file e le directory nascosti inizieranno sempre con un punto (.). Per impostazione predefinita, la home directory di un utente includerà molti file nascosti. Questi vengono spesso utilizzati per configurare impostazioni di configurazione specifiche dell’utente (come il logout dalla shell bash o le configurazioni del browser web installato).
L’opzione Long List
Il comando ls ha molte opzioni per cambiarne il comportamento. Diamo un’occhiata a una delle opzioni più comuni:
$ ls -l
-rw-r--r-- 1 user staff 3606 Jan 13 2017 report2018.txt
ls -l crea una long list. I file e le directory occuperanno ciascuno una riga, ma verranno visualizzate più informazioni possibili su ciascun file e directory, vediamoli nel dettaglio.
-rw-r—r--
Tipo di file e autorizzazioni del file. Si noti che un file normale inizierà con trattino e una directory inizierà con d
1
Numero di collegamenti al file
user staff
Specifica la proprietà del file. l’utente user è il proprietario del file e il file è anche associato al gruppo staff
3606
Dimensione del file in byte
Jan 13 2017
Data e ora dell’ultima modifica al file.
report2018.txt
Nome del file
Argomenti come proprietà, autorizzazioni e collegamenti saranno trattati nelle sezioni future. Come puoi vedere, la lunga lista di ls -l è spesso preferibile al valore predefinito.
Altre opzioni di ls
Di seguito sono riportati alcuni dei modi in cui utilizziamo più comunemente il comando ls. Come puoi vedere, l’utente può combinare insieme molte opzioni per ottenere l’output desiderato.
ls -lh
La combinazione dell’opzione long list con human readable che rende leggibile la dimensione del file fornendo suffissi utili come M per megabyte o K per kilobyte.
ls -d */
L’opzione -d elencherà le directory ma non il loro contenuto. Combinando questo con * / verranno visualizzate solo le sottodirectory e nessun file.
ls -lt
Combina l’opzione long list con l’opzione che permette di ordinare in base alla data di modifica. I file con le modifiche più recenti saranno in alto, mentre i file con le modifiche più vecchie saranno in fondo. Ma questo ordine può essere invertito con:
ls -lrt
Con l’aggiunta di -r viene invertito l’ordinamento. Ora i file con le modifiche più recenti sono in fondo all’elenco. Oltre all’ordinamento per data e ora di modifica, i file possono anche essere ordinati per data e ora di accesso.
ls -lX
Combina l’opzione long list con l’opzione per ordinare in base all’estensione dei file. Ad esempio, verranno raggruppati tutti i file che terminano con .txt, tutti i file che finiscono con .jpg e così via.
ls -S
-S ordina per dimensione del file. I file più grandi verranno prima e per ultimi i più piccolo. Si noti che i contenuti delle sottodirectory non sono inclusi nell’ordinamento.
ls -R
L’opzione -R modificherà il comando ls per visualizzare un elenco ricorsivo. Cosa significa questo?
Ricorsione in Bash
La ricorsione si riferisce a una situazione in cui “qualcosa include se stesso nella propria definizione”. La ricorsione è un concetto molto importante nell’informatica, ma qui il suo significato è molto più semplice. Consideriamo il nostro esempio di prima:
$ ls ~
Documents
Sappiamo che user ha una home directory e in questa directory c’è una sottodirectory. Fino ad ora abbiamo visto che ls può mostrarci i file e le sottodirectory, ma non ci permette di vedere il contenuto di queste sottodirectory. In queste lezioni, abbiamo usato il comando tree quando vogliamo visualizzare il contenuto di molte directory. Sfortunatamente, tree non è una delle utility principali di Linux e quindi non è sempre disponibile. Confrontate l’output di tree con l’output di ls -R nel seguente esempio:
$ tree /home/user
user
└── Documents
├── Mission-Statement
└── Reports
└── report2018.txt
$ ls -R ~
/home/user/:
Documents
/home/user/Documents:
Mission-Statement
Reports
/home/user/Documents/Reports:
report2018.txt
Come puoi vedere, con l’opzione ricorsiva, otteniamo un elenco di file molto più lungo. In effetti, è come se avessimo eseguito il comando ls nella home directory di user e avessimo incontrato una sottodirectory. Quindi, siamo entrati in quella sottodirectory ed abbiamo eseguito nuovamente il comando ls. Abbiamo incontrato il file Mission-Statement e un’altra sottodirectory chiamata Reports. E di nuovo, siamo entrati nella sottodirectory ed abbiamo eseguito nuovamente il comando ls. In sostanza, eseguire ls -R è come dire a Bash: “Esegui ls qui e ripeti il comando in ogni sottodirectory che trovi.” La ricorsione è particolarmente importante nei comandi di modifica dei file come la copia o la rimozione di una directory. Ad esempio, se si desidera copiare la sottodirectory Documents, è necessario specificare una copia ricorsiva per estendere questo comando a tutte le sottodirectory.