Prima di poter gestire i file occorre saper amministrare i loro contenitori: le directory. Questo capitolo analizza i programmi attraverso i quali si possono gestire le directory e analizzare il loro contenuto.
La tabella (seguente) elenca i programmi a cui si accenna in questo capitolo.
La directory è un tipo speciale di file, il cui scopo è quello di contenere riferimenti ad altri file e/o directory. Detto in altri termini, la directory è un indice di file e/o di altri sottoindici.
I permessi attribuiti a una directory vanno interpretati in maniera particolare:
mkdir [<opzioni>] <directory>...
Crea una o più directory. In mancanza di indicazioni gli attributi della nuova directory sono 777 meno i bit della maschera umask. Il valore tipico di umask è 022 e di conseguenza gli attributi normali di una nuova directory sono 755, cosa che in pratica permette a tutti di accedere e leggerne il contenuto, ma concede solo al proprietario di modificarle.
-
m | -
-
mode=<modo>
Permette di definire esplicitamente i permessi attribuiti alla o alle directory che vengono create. I permessi possono essere attribuiti in forma numerica o in forma simbolica. La sintassi della forma simbolica è descritta in occasione della presentazione del programma chmod ( chmod).
-
p | -
-
parents
Fa in modo che vengano create anche le directory precedenti se queste non sono presenti. In tal caso la modalità utilizzata, per i permessi di queste directory precedenti, corrisponde a quanto stabilito per quella o quelle directory da creare con la aggiunta (se necessario) dei permessi in scrittura ed esecuzione per l'utente proprietario. Infatti, sarebbe normalmente logico pensare che almeno al proprietario sia concesso di accedervi e di poterle modificare.
-
-
verbose
Emette un messaggio per ogni directory creata.
È particolarmente utile in abbinamento all'opzione -
p.
rmdir [<opzioni>] <directory>...
Elimina le directory indicate, se sono vuote.
-
p | -
-
parents
Elimina anche le directory precedenti se, dopo la cancellazione delle directory finali, queste restano vuote.
Il ``percorso'' o path è il modo con cui si identifica la posizione di un certo file o 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. In tal caso si usa spesso il termine ``nome di percorso'' o pathname.
pwd [<opzioni>]
pwd (Print Working Directory) emette attraverso lo standard output il percorso completo della directory corrente. Viene mostrato il percorso reale, traducendo i link simbolici.
<!> È 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.
basename <pathname> [<suffisso>]
Estrae il nome di un file da un pathname, cioè da un nome contenente l'informazione del percorso e del file. In pratica: rimuove da pathname la parte anteriore contenente l'informazione sulla directory, ed eventualmente, il suffisso indicato dalla parte finale del nome rimanente. Il risultato viene emesso attraverso lo standard output.
$
basename "/topolino/pippo"
pippo
---------
$
basename "/topolino/eta-
beta.sh" ".sh"
eta-beta
---------
$
basename "/topolino/eta-
beta.sh" "beta.sh"
eta-
dirname <pathname>
Estrae il nome della directory da un pathname, cioè da un nome contenente l'informazione del percorso e del file. In pratica: rimuove da pathname la parte finale a partire dall'ultima barra obliqua (/) di divisione tra l'informazione della directory e il nome del file. Se il pathname contiene solo un nome di file, il risultato è . (un singolo punto), cioè la directory corrente. Il risultato viene emesso attraverso lo standard output.
$
dirname "/topolino/pippo"
/topolino
namei [<opzioni>] <pathname>...
Scompone un pathname finché raggiunge un punto terminale. In pratica vengono analizzati i pathname forniti, ne viene scomposto e descritto il contenuto nelle varie (eventuali) sottodirectory e infine, se tra gli elementi contenuti nei pathname richiesti esistono dei link simbolici, viene visualizzato anche l'elemento di destinazione. Questo programma è particolarmente utile per seguire i link simbolici, soprattutto quando questi hanno troppi livelli, cioè quando un link punta a un altro link ecc.. I vari elementi visualizzati sono preceduti da una lettera che ne descrive le caratteristiche:
-
file normale;
$
namei /usr/X11
Genera il seguente risultato:
f: /usr/X11
d /
d usr
l X11 -> X11R6
d X11R6
dal quale si intende che la directory /usr/X11 in realtà non esiste, e che si tratta di un link simbolico alla vera directory /usr/X11R6.
pathchk [<opzioni>] [<pathname>... ]
Per ogni pathname 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:
-
p | -
-
portability
Invece di eseguire un controllo in base alle possibilità del filesystem effettivamente in funzione, il programma si basa sulle specifiche minime stabilite dallo standard POSIX.1 sulla portabilità. Inoltre viene controllato che non siano usati caratteri che potrebbero creare problemi di portabilità.
$
pathchk -
p /home/paperino/perché
path `/home/paperino/perché' contains nonportable character `é'
Quando a un programma devono essere passati uno o più nomi di file tra gli argomenti, si utilizza il meccanismo del file globbing attraverso il quale, con l'uso di simboli adatti, ci si riferisce a gruppi di file. La trasformazione del file globbing in elenchi di file (e directory) effettivamente esistenti è compito della shell: è cioè qualcosa a cui gli altri programmi sono normalmente estranei. Nella sezione `Espansione di pathname' viene trattato il modo con cui la shell bash si comporta al riguardo.
Il contenuto di una directory viene normalmente analizzato attraverso il programma ls. In particolare, ls può essere configurato in modo da colorare i nomi dei file in modo diverso a seconda del tipo.
ls [<opzioni>] [<nome>...]
Visualizza i nomi di file o il contenuto delle directory indicate. In mancanza di questa indicazione 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 e/o directory nella riga di comando, è compito della shell espandere eventuali caratteri jolly. Di conseguenza, in questo caso, è la shell a non fornire a ls i nomi che iniziano con un punto.
Il funzionamento predefinito di ls dipende anche dalla configurazione fatta attraverso dircolors. In generale, a meno che non sia indicato diversamente, ls genera un elenco ordinato per colonne se lo standard output è diretto allo schermo del terminale, oppure un elenco su una unica colonna se viene diretto altrove. Questa particolarità è molto importante per poter gestire, attraverso elaborazioni successive, l'output di questo programma.
-
a | -
-
all
Per ciò che è competenza di ls, vengono elencati anche gli elementi i cui nomi iniziano con punto (i cosiddetti file nascosti).
-
A | -
-
almost-
all
Vengono elencati tutti gli elementi, esclusi . e ...
-
l | -
-
format=long | -
-
format=verbose
Oltre ai nomi, vengono visualizzati il tipo, i permessi, il numero di hard link, il nome del proprietario, il nome del gruppo, la dimensione in byte, la data di modifica.
-
q | -
-
hide-
control-
chars
Utilizza il punto interrogativo per sostituire i caratteri non stampabili eventualmente contenuti nei nomi.
-
R | -
-
recursive
Vengono elencati i contenuti di tutte le directory in modo ricorsivo.
-
t | -
-
time=time
Ordina il contenuto delle directory in funzione della data: dalla più recente alla più antica. Se non viene specificato diversamente, si fa riferimento alla data di modifica.
-
c | -
-
time=ctime | -
-
time=status
Utilizza la data di cambiamento dello stato dei file (ovvero la data di creazione).
Se viene usato il formato lungo di visualizzazione (-
l), viene
visualizzata questa data, se viene usato insieme a -
t,
l'elenco viene ordinato in base a questa data.
-
u | -
-
time=atime | -
-
time=access | -
-
time=use
Utilizza la data di accesso ai file.
Se viene usato il formato lungo di visualizzazione (-
l), viene
visualizzata questa data, se viene usato insieme a -
t, l'elenco
viene ordinato in base a questa data.
-
e | -
-
full-time
Quando l'elenco comprende l'indicazione della data, questa viene espressa in modo dettagliato.
-
i | -
-
inode
Emette, alla sinistra delle indicazioni inerenti i file, il numero di inode.
-
r | -
-
reverse
Riordina in modo inverso rispetto al normale.
-
B | -
-
ignore-backups
Esclude dall'elenco i file che terminano con il simbolo tilde (~). Infatti, questo simbolo viene utilizzato per distinguere le cosiddette ``copie di backup'' dei file.
-
C | -
-
format-vertical
Emette un elenco organizzato in colonne, indipendentemente dalla destinazione dello standard output.
-
F | -
-
classify
Se non è già la modalità di funzionamento predefinita, aggiunge un carattere alla fine dei nomi dei file, in modo da riconoscerne il tipo:
-
S | -
-
sort=size
Riordina in base alla dimensione in modo decrescente.
-
X | -
-
sort=extension
Riordina in base all'estensione, cioè alla parte di nome che appare dopo l'ultimo punto. I nomi che non contengono alcun punto hanno la precedenza.
-
1 | -
-
format=single-column
Elenca i nomi, uno per ogni riga.
-
8 | -
-
8bit
Utilizza la codifica ISO-8859 per visualizzare i caratteri. Questa è la modalità normalmente predefinita.
-
w n | -
-
width n
Definisce la larghezza a disposizione per l'elenco. Il valore n si riferisce al numero di caratteri utilizzabili. Di solito, la larghezza viene determinata in funzione del numero di colonne che ha a disposizione il terminale o la finestra del terminale.
-
I <modello> | -
-
ignore <modello>
Permette di escludere dall'elenco i file che sono rappresentati dal modello specificato, a meno che non siano espressamente indicati nella riga di comando.
$
ls -
l
Visualizza un elenco lungo del contenuto della directory corrente.
$
ls -
R /*/*/dir*
Cerca, a partire dal secondo livello dopo la directory radice, gli elementi che iniziano per dir.
eval `dircolors [<opzioni>] [<file>]`
Configura la colorazione e le modalità predefinite di funzionamento di ls. 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 consta 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"
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:
cd=40;33;01:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:
*.bat=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:
*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.jpg=01;35:
*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:
Con questa variabile si può costruire un alias al programma ls.
$
alias ls='
/bin/ls -
-
color'
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 in dircolors(1) e ls(1).
file [<opzioni>] <file>...
Determina il tipo di file. Il programma analizza i file indicati come argomento e cerca di classificarli utilizzando il seguente ordine di analisi: filesystem, numero magico, linguaggio.
Quando il programma analizza i file in base al cosiddetto numero magico, utilizza le informazioni contenute all'interno di /usr/lib/magic che in pratica contiene delle stringhe o delle sequenze binarie di riconoscimento.
du [<opzioni>] <file>...
du (Disk Usage) emette una sorta di statistica dell'utilizzo dello spazio da parte di un elenco di file e/o directory (in base al loro contenuto).
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 1024 byte.
-
a | -
-
all
Emette il conteggio riferito a tutti i file, non solo alle directory.
-
b | -
-
byte
Emette le dimensioni in byte e non in Kbyte.
-
k | -
-
kilobytes
Emette le dimensioni in Kbyte. Questa opzione fa riferimento all'unità di misura predefinita, ma permette di fare ignorare a du l'eventuale presenza della variabile POSIXLY_CORRECT.
-
m | -
-
megabytes
Emette le dimensioni in Mbyte.
-
h | -
-
human-
readable
Aggiunge una lettera alla dimensione, in modo da chiarire il tipo di unità di misura utilizzato.
-
c | -
-
total
Emette anche un totale generale finale.
-
s | -
-
summarize
Emette solo un totale per ogni argomento.
-
S | -
-
separate-
dirs
Emette la dimensione delle directory in modo separato, senza includere lo spazio utilizzato dalle sottodirectory.
-
x | -
-
one-
file-
system
Salta il conteggio delle directory che si trovano in un filesystem diverso da quello di partenza.
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.
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 filesystem. In questi casi conviene utilizzare l'indicazione del percorso per avviare esattamente quello che si vuole. Questo è la situazione tipica degli script di configurazione che si usano per preparare un applicativo prima della sua compilazione:
$
./configure
which <programma>...
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 determinato comando, sia quale programma viene effettivamente scelto nel caso ne esistano diversi con lo stesso nome collocati in posizioni diverse nell'albero di directory.
which potrebbe non essere un programma vero e proprio, ma semplicemente un
alias a un comando di shell.
In effetti, which compie lo stesso compito del comando
type -
path della shell bash
(
`Bash type').
whereis [<opzioni>] <file>...
Localizza i file binari, i sorgenti e le pagine di manuale dei file specificati nell'argomento.
Vedere whereis(1).
1997.10.26 - Scritto da Daniele Giacomini daniele@calion.com (vedi copyright: Appunti Linux).