[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
Prima di poter gestire i file occorre saper amministrare i loro contenitori: le directory. Questo capitolo descrive i programmi attraverso i quali si possono gestire le directory e analizzare il loro contenuto. La tabella 122.1 elenca i programmi a cui si accenna in questo capitolo.
I programmi GNU che hanno a che fare con la misurazione di quantità di byte, possono essere configurati facilmente per ciò che concerne il sistema di misura da utilizzare. Esiste tradizionalmente un divario tra la misurazione dei dati e il SI (il Sistema internazionale di unità, <http://www.bipm.fr/>). Per cercare di mettere un po' di ordine in questa confusione, è possibile intervenire su alcune variabili di ambiente per ottenere un comportamento differente da parte dei programmi.
Attraverso la variabile di ambiente BLOCK_SIZE, è possibile stabilire la dimensione di un «blocco», cioè la quantità di byte usata come unità di riferimento. In generale, se la variabile di ambiente POSIXLY_CORRECT è stata definita (indipendentemente dal suo contenuto) e la variabile BLOCK_SIZE non c'è, i blocchi sono di 512 byte; diversamente, è la variabile BLOCK_SIZE a prendere il sopravvento. Inoltre, se nessuna di queste variabili è presente, il blocco predefinito è di 1 024 byte.
Nel gergo che si è sviluppato nei programmi GNU, dal momento che i blocchi di 512 byte sono difficili da valutare rapidamente, si fa riferimento al concetto di «human readable» per dire che i blocchi sono da 1 024 byte. Tuttavia, la facilità di lettura che si sottintende in questo modo, è solo approssimativa, perché le convenzioni umane portano a pensare in base a una numerazione decimale. Pertanto, la variabile BLOCK_SIZE, oltre che contenere un numero, che rappresenta la dimensione del blocco in byte, può contenere due stringhe ben precise, a cui viene dato un significato determinato. Si veda la tabella 122.2.
In particolare, quando la variabile di ambiente BLOCK_SIZE contiene la stringa si, il valore dei simboli usati come moltiplicatori, assume un significato diverso. Si osservi per questo la tabella 122.3.
|
A livello della riga di comando, si può intervenire attraverso opzioni comuni, che in generale prendono il sopravvento sulle impostazioni delle variabili di ambiente. La tabella 122.4 riassume queste opzioni.
|
Sarebbero disponibili anche altre variabili di ambiente, che permettono la configurazione specifica di ogni programma di servizio. Eventualmente si può consultare la documentazione originale.
La directory è un tipo speciale di file, il cui scopo è quello di contenere riferimenti ad altri file e ad altre directory. In altri termini, la directory è un indice di file ed eventualmente di altri sottoindici.
I permessi attribuiti a una directory vanno interpretati in maniera particolare:
il permesso di lettura permette di conoscere il contenuto di una directory attraverso un programma come ls o simile, senza il quale, la directory può essere attraversata ugualmente;
il permesso di scrittura permette di modificarne il contenuto, cioè di aggiungere o eliminare file e altre directory;
il permesso di «esecuzione» permette il suo attraversamento, ovvero permette di raggiungere il suo contenuto o quello di altre directory discendenti.
Il programma di servizio mkdir (1) (Make directory) crea una o più directory:
mkdir [opzioni] directory... |
In mancanza di indicazioni gli attributi della nuova directory sono 7778 meno i bit della maschera dei permessi. Il valore tipico di questa maschera è 0228 e di conseguenza gli attributi normali di una nuova directory sono 7558, cosa che in pratica permette a tutti di accedere e leggerne il contenuto, ma concede solo al proprietario di modificarle.
|
Il programma di servizio rmdir (2) (Remove directory) elimina le directory indicate, se sono vuote:
rmdir [opzioni] directory... |
|
Il percorso o path è il modo con cui si identifica la posizione di un file o di una directory. File e directory vengono spesso indicati per nome facendo riferimento a una posizione sottintesa: la directory corrente (o attuale). File e directory possono essere indicati utilizzando un nome che comprende anche l'indicazione del percorso necessario a raggiungerli.
Il programma di servizio pwd (3) (Print working directory) emette attraverso lo standard output il percorso assoluto della directory corrente. Viene mostrato il percorso reale, traducendo i collegamenti simbolici.
pwd [opzioni] |
È molto probabile che la shell utilizzata metta a disposizione un comando interno con lo stesso nome. Il funzionamento di questo comando potrebbe essere leggermente differente da quello del programma. |
Il programma di servizio basename (4) estrae il nome di un file o di una directory da un percorso:
basename percorso [suffisso] |
In pratica: rimuove dal percorso la parte anteriore contenente l'informazione sulla directory; inoltre, eventualmente, rimuove anche il suffisso indicato dalla parte finale del nome rimanente. Il risultato viene emesso attraverso lo standard output.
Segue una sequenza di esempi senza spiegazione, da cui si vede comunque come si comporta il programma:
$
basename "/idrogeno/ossigeno"
[Invio]
ossigeno |
$
basename "/idrogeno/eliografia.sh" ".sh"
[Invio]
eliografia |
$
basename "/idrogeno/eliografia.sh" "grafia.sh"
[Invio]
elio |
Il programma di servizio dirname (5) (Directory name) estrae la directory da un percorso:
dirname percorso |
In pratica: rimuove dal percorso la parte finale a partire dall'ultima barra obliqua (/) di divisione tra l'informazione della directory e il nome del file. Se il percorso contiene solo un nome di file, il risultato è un punto singolo (.), cioè la directory corrente. Il risultato viene emesso attraverso lo standard output.
Segue una sequenza di esempi senza spiegazione, da cui si vede comunque come si comporta il programma:
$
dirname "/idrogeno/ossigeno/elio"
[Invio]
/idrogeno/ossigeno |
$
dirname "/idrogeno/ossigeno"
[Invio]
/idrogeno |
$
dirname "/idrogeno"
[Invio]
/ |
$
dirname "idrogeno"
[Invio]
. |
Il programma di servizio namei (6) scompone un percorso finché raggiunge un punto terminale:
namei [opzioni] percorso... |
In pratica, attraverso namei vengono analizzati i percorsi forniti, ne viene scomposto e descritto il contenuto nelle varie (eventuali) sottodirectory, quindi, se tra gli elementi contenuti nei percorsi richiesti esistono dei collegamenti simbolici, viene visualizzato anche l'elemento di destinazione. Questo programma è particolarmente utile per seguire i collegamenti simbolici, soprattutto quando questi hanno troppi livelli, cioè quando un collegamento punta a un altro collegamento ecc. I vari elementi visualizzati sono preceduti da una lettera che ne descrive le caratteristiche:
Segue la descrizione di alcuni esempi.
$
namei /usr/bin/X11
[Invio]
Genera il risultato seguente:
f: /usr/bin/X11 d / d usr d bin l X11 -> ../X11R6/bin d .. d X11R6 d bin |
Da questo si intende che la directory /usr/bin/X11/
in realtà non esiste, trattandosi di un collegamento simbolico alla vera directory /usr/X11R6/bin/
.
$
namei /usr/bin/x-www-browser
[Invio]
f: x-www-browser l x-www-browser -> /etc/alternatives/x-www-browser d / d etc d alternatives l x-www-browser -> /usr/bin/mozilla d / d usr d bin l mozilla -> /etc/alternatives/mozilla d / d etc d alternatives l mozilla -> /usr/bin/mozilla-1.6 d / d usr d bin - mozilla-1.6 |
In questo caso si analizza il nome /usr/bin/x-www-browser
, che nelle distribuzioni GNU/Linux Debian rappresenta il «navigatore» grafico standard installato nel sistema. Come si vede, dopo una serie di passaggi, si arriva al programma /usr/bin/mozilla-1.6
.
Il programma di servizio pathchk (7) (Path check) consente di controllare i percorsi:
pathchk [opzioni] [percorso...] |
Per ogni percorso indicato come argomento viene eseguita una verifica e, se necessario, viene emesso attraverso lo standard output un messaggio per informare di uno dei problemi seguenti:
una delle directory esistenti, indicate all'interno di uno dei percorsi, non ha il permesso di esecuzione necessario per essere attraversata;
la lunghezza totale di un percorso è maggiore di quella gestibile con quel tipo di file system;
la sola lunghezza di uno degli elementi di un percorso è maggiore di quella gestibile con quel tipo di file system.
|
Il programma restituisce zero se tutti i percorsi hanno superato i controlli con successo; altrimenti restituisce il valore uno.
Seguono alcuni esempi autoesplicativi:
$
pathchk -p /home/perché
[Invio]
path `/home/perché' contains nonportable character `é' |
$
pathchk -p "/home/tizio/ciao bella"
[Invio]
path `/home/tizio/ciao bella' contains nonportable character ` ' |
Naturalmente, se il percorso è corretto, non si ottiene alcuna segnalazione.
Quando a un programma devono essere passati uno o più nomi di file tra gli argomenti, si possono rappresentazione più nomi contemporaneamente attraverso un modello che fa uso di simboli adatti (a questo proposito si parla anche di globbing). La trasformazione del modello in elenchi di file (e directory) esistenti effettivamente, è compito della shell, cioè si tratta di qualcosa a cui gli altri programmi sono normalmente estranei. Nella sezione 103.2.9 viene trattato il modo con cui una shell POSIX si comporta al riguardo.
Il contenuto di una directory viene analizzato normalmente attraverso il programma ls. In particolare, la realizzazione GNU di ls può essere configurata per colorare i nomi dei file in modo diverso a seconda del tipo di questi.
Il programma di servizio ls (8) (List) visualizza i nomi di file o il contenuto delle directory indicate:
ls [opzioni] [nome...] |
In mancanza dell'indicazione esplicita di file o di directory, viene visualizzato il contenuto della directory corrente e di norma non vengono inclusi i nomi di file e directory il cui nome inizia con un punto: questi sono considerati nascosti.
È importante ricordare che se vengono indicati dei nomi di file o directory nella riga di comando, è compito della shell espandere eventuali caratteri jolly. Di conseguenza, in questo caso, è la shell che non fornisce a ls i nomi che iniziano con un punto. |
Il funzionamento predefinito di ls GNU dipende anche dalla configurazione fatta attraverso dircolors. In generale, se non viene indicato diversamente, ls genera un elenco ordinato per colonne se lo standard output è diretto allo schermo del terminale, oppure un elenco su un'unica colonna se viene diretto altrove. Questa particolarità è molto importante per poter gestire l'output di questo programma attraverso elaborazioni successive.
|
Segue la descrizione di alcuni esempi.
$
ls -l
[Invio]
Visualizza un elenco lungo del contenuto della directory corrente.
$
ls -la
[Invio]
Visualizza un elenco lungo del contenuto della directory corrente, che include anche i nomi che iniziano con un punto.
$
ls -R /*/*/dir*
[Invio]
Cerca, a partire dal secondo livello dopo la directory radice, gli elementi che iniziano per «dir».
$
ls -I \*.html
[Invio]
Elenca il contenuto della directory corrente, escludendo i file corrispondenti al modello *.html
. La barra obliqua inversa davanti all'asterisco serve per richiedere alla shell di non espanderlo e non viene passata a ls.
Il programma ls può essere avviato usando nomi differenti, ottenendo così un comportamento particolare:
dir [opzioni] [nome...] |
vdir [opzioni] [nome...] |
Usando il nome dir si ottiene l'equivalente di ls -C -b, mentre con il nome vdir si ottiene l'equivalente di ls -l -b. In pratica, nel primo caso si vuole ricordare il funzionamento del comando DIR dei sistemi Dos, mentre nel secondo il prefisso «v» sta per vertical.
Il programma dircolors configura la colorazione e le modalità predefinite di funzionamento di ls:
eval `dircolors [opzioni] [file]` |
Se non viene specificato il file di configurazione in modo esplicito, dircolors cerca di utilizzare ~/.dir_colors
e in mancanza di questo /etc/DIR_COLORS
, che si riferisce alla configurazione generale del sistema dei colori per ls.
dircolors è fatto per essere avviato immediatamente dopo l'esecuzione di una shell, in quanto la configurazione si traduce nella creazione della variabile di ambiente LS_COLORS, con la quale si possono definire degli alias di shell per attuare in pratica questa configurazione.
Per analizzarne il contenuto basta utilizzare il comando seguente:
$
echo "$LS_COLORS"
[Invio]
Si ottiene un record molto lungo. Di seguito appare un esempio di questo, spezzato in più parti per poterlo consultare.
no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:\ |
Con questa variabile si può costruire un alias al programma ls.
$
alias ls='/bin/ls --color'
[Invio]
In questo modo, l'alias ls avvia il programma /bin/ls
con l'argomento --color che attiva la gestione dei colori utilizzando il contenuto della variabile LS_COLORS. I dettagli sul funzionamento di dircolors e sul modo con cui può essere configurato si trovano nelle pagine di manuale dircolors(1) e ls(1).
Il programma di servizio file (9) consente di determinare il tipo di file:
file [opzioni] file... |
Il programma analizza i file indicati come argomento e cerca di classificarli utilizzando l'ordine di analisi seguente: file system, magic number, linguaggio. Quando il programma analizza i file in base al cosiddetto magic number, utilizza le informazioni contenute all'interno di /usr/share/misc/magic
che in pratica contiene delle stringhe o delle sequenze binarie di riconoscimento.
Il programma di servizio du (10) (Disk usage) emette una sorta di statistica dell'utilizzo dello spazio da parte di un elenco di file o directory (in base al loro contenuto):
du [opzioni] file... |
L'unità di misura con cui si esprime questo spazio è in blocchi, la cui dimensione cambia a seconda delle opzioni utilizzate oppure dalla presenza di una variabile di ambiente: POSIXLY_CORRECT. Se esiste e non viene usata l'opzione -k, fa sì che i blocchi siano di 512 byte come prevede per questo lo standard POSIX. Diversamente, il valore predefinito dei blocchi è di 1 024 byte.
|
In linea di principio, per avviare un file eseguibile ci sarebbe bisogno di indicare precisamente il suo percorso. Per ovviare a questo inconveniente viene utilizzato un elenco di percorsi possibili all'interno dei quali devono essere cercati i file eseguibili che sono stati indicati semplicemente per nome. Questo elenco di percorsi è gestito dalla shell e normalmente viene contenuto nella variabile di ambiente PATH.
Se si vuole poter avviare un eseguibile dalla directory corrente senza indicare il suo percorso (./programma
), occorre includere anche la directory corrente (.) nell'elenco della variabile PATH.
Per convenzione, ma anche per motivi di sicurezza, si mette il punto che simboleggia la directory corrente alla fine della serie contenuta nella variabile PATH. |
Tanto più grande è il numero di directory contenuto nella variabile PATH, tanto maggiore è il rischio di avviare eseguibili diversi da quelli desiderati. Molti file script standard hanno lo stesso nome e si distribuiscono in più punti del file system. In questi casi conviene utilizzare l'indicazione del percorso per avviare esattamente quello che si vuole. Questa è la situazione tipica degli script di configurazione che si usano per preparare un applicativo prima della sua compilazione:
$
./configure
[Invio]
Il comando which simula la ricerca che farebbe la shell per avviare i programmi indicati negli argomenti e determina la posizione di quelli che verrebbero scelti. Ciò è utile per sapere: sia dove si trova un comando determinato, sia quale programma viene scelto effettivamente nel caso ne esistano diversi con lo stesso nome collocati in posizioni differenti nell'albero di directory.
which programma... |
In pratica, invece di essere un programma vero e proprio, potrebbe trattarsi semplicemente di un alias a un comando di shell. In effetti, which compie lo stesso ruolo del comando type -path della shell Bash.
Il programma whereis individua i file binari, i sorgenti e le pagine di manuale dei file specificati nell'argomento. (11)
whereis [opzioni] file... |
Si veda eventualmente la pagina di manuale whereis(1).
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
1) GNU core utilities GNU GPL
2) GNU core utilities GNU GPL
3) GNU core utilities GNU GPL
4) GNU core utilities GNU GPL
5) GNU core utilities GNU GPL
6) util-linux: namei GNU GPL
7) GNU core utilities GNU GPL
8) GNU core utilities GNU GPL
9) File software libero con licenza speciale
10) GNU core utilities GNU GPL
11) util-linux: whereis UCB BSD
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome directory_percorsi_e_contenuti.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]