Directory e File
Il contenitore fondamentale di un Filesystem Linux è rappresentato dalle directory, agire su di esse è quindi una necessità comune.
Il comando mkdir crea directory. Di norma mkdir genera un solo livello per volta ma aggiungendo l’opzione -p è possibile produrre una serie di directory innestate, vale a dire una directory e altre subdirectory in cui la precedente contiene la successiva a guisa di scatole cinesi.
fprincipe@html1:~$ mkdir -p 1/2/3/4
fprincipe@html1:~$ tree 1
1
└── 2
└── 3
└── 4
3 directories, 0 files
Ovviamente esiste l’omologo inverso rmdir ovvero il comando che le rimuove. Anch'esso è comunemente adoperato su una singola directory tuttavia sempre tramite l’opzione -p è possibile istruirlo a “potare” un albero di directory. Può operare solo su directory e sottodirectory prive di file. Se lo eseguiamo su una directory che abbiamo popolato con un file otterremo un errore sino a quando non elimineremo quest'ultimo.
fprincipe@html1:~$ rmdir -p 1/2/3/4
rmdir: failed to remove directory '1': Directory not empty
Il comando per rimuovere file e directory rm è più potente. Possiamo passargli un singolo elemento, una serie di elementi separati da spazi, persino directory indifferentemente vuote o non vuote purché accompagnante dall'opzione -r che istruisce la ricorsività. Per evitare avvisi e richieste di conferma adoperate l’opzione -f e “forzerete” ogni automatismo precauzionale ove ciò sia possibile. Attenzione: un simile comando, specie se abbinato a una espressione regolare particolarmente permissiva, come il carattere asterisco, può risultare particolarmente pericoloso.
A esempio il comando rm -fr * è potenzialmente in grado di cancellare tutto il contenuto della directory corrente senza produrre alcun avviso.
A seguire un esempio d'uso.
fprincipe@html1:~$ tree
.
├── dir
│ └── file-in-dir
└── file
fprincipe@html1:~$ rm -fr dir file
fprincipe@html1:~$
Per rinominare o muovere file e directory adoperate il comando mv che ridefinisce il percorso di una risorsa e il suo nome. Molto simile il comportamento di cp che genera un nuovo elemento come richiesto ma, a differenza del comando precedente, mantiene nel filesystem anche l’originale creando, di fatto, una copia. Ovviamente il comando cp non può operare con sorgente e destinazione coincidenti e richiede -r per agire in maniera ricorsiva quindi sulle directory.
I Link
Uno dei metodi più efficaci per gestire la copia di un file o di una directory in un Filesystem Linux si appoggia alla generazione di un link. E’ un approccio che consente di economizzare lo spazio disco e risulta più funzionale perché evita di dover gestire lo stesso insieme di dati in più copie magari disallineate, quando questo non è necessario, preservando comunque la possibilità di presentare le stesse risorse da diversi percorsi di un filesystem. Per far ciò è possibile ricorrere a due differenti tipi di link: Hard e Symbolic. Il Symbolic Link è un collegamento al nome del file e al suo percorso, pertanto, se questi variano, il link risulterà inefficace. Lo Hard Link è un collegamento all’inode del file quindi rappresenta un’altra faccia del medesimo file. Osserviamo il comando in azione per entrambe le tipologie.
fprincipe@html1:~/testlink$ ls -lia
total 12
557401 drwxrwxr-x 2 fprincipe fprincipe 4096 Mar 23 15:35 .
539623 drwxr-xr-x 7 fprincipe fprincipe 4096 Mar 23 15:34 ..
525033 -rw-rw-r-- 1 fprincipe fprincipe 3 Mar 23 15:35 file
fprincipe@html1:~/testlink$ ln file hardlink
fprincipe@html1:~/testlink$ ln -s file symboliclink
fprincipe@html1:~/testlink$ ls -lia
total 16
557401 drwxrwxr-x 2 fprincipe fprincipe 4096 Mar 23 15:37 .
539623 drwxr-xr-x 7 fprincipe fprincipe 4096 Mar 23 15:34 ..
525033 -rw-rw-r-- 2 fprincipe fprincipe 3 Mar 23 15:35 file
525033 -rw-rw-r-- 2 fprincipe fprincipe 3 Mar 23 15:35 hardlink
539437 lrwxrwxrwx 1 fprincipe fprincipe 4 Mar 23 15:37 symboliclink -> file
La creazione di un “symbolic” tramite ln richiede l’aggiunta di una opzione -s prima del nome del file e del target.
Senza questa opzione la richiesta è interpretata come “hard”.
Osservando l’output di ls prima della creazione dei link e dopo la creazione dei link potremo scoprire molte utili informazioni.
Innanzi tutto non c’è modo di distinguere tramite ls il file di cui è stato creato un hard link dal risultato di un comando di hard link, in pratica sono due rappresentazioni equivalenti di un'unica entità.
Ciò si desume anche osservando le differenze fra la terza colonna dell’output di ls per ciò che concerne "file". Prima il valore è 1, poi diventa 2, questa colonna infatti palesa il numero di riferimenti verso l’inode della risorsa corrispondente.
Discorso diverso invece per il symbolic link. Magari il symbolic link potrebbe essere, a puro titolo d’esempio, abilitato in lettura e scrittura per l'utente a cui è assegnato ma l'elemento puntato esserlo, di fatto, solo in lettura per lo stesso utente.
Da queste ovvie considerazioni comprenderete che ha senso un link verso una directory solo se symbolic, che quando agiamo su symbolic link agiamo su una entità distinta dal soggetto a cui questo punta, che i comandi di cancellazione sulle molte facce di un file non hanno effetto sui dati del file a meno che questi non sia di fatto l’ultima istanza di questo verso l’inode.
Chiudiamo questo argomento con una interessante curiosità. Quando lanciamo il comando ls -a le due entità da esso elencate come prime sono “.” e “..”, due hard link che fanno rispettivamente riferimento alla directory corrente e a quella in cui quest’ultima è contenuta. Ciò vale ovunque tranne che nella directory root ove puntano entrambe alla directory corrente. Avevamo indirettamente incrociato queste entità quando abbiamo affrontato l’indirizzamento relativo e assoluto.