7.2. Operatori di verifica di file

Restituiscono vero se...

-e

il file esiste

-a

il file esiste

Effetto identico a -e, ma ne è stato "deprecato" [1] e scoraggiato l'utilizzo.

-f

il file è un file regolare (non una directory o un file di dispositivo)

-s

il file ha dimensione superiore a zero

-d

il file è una directory

-b

il file è un dispositivo a blocchi (floppy, cdrom, ecc.)

-c

il file è un dispositivo a caratteri (tastiera, modem, scheda audio, ecc.)

-p

il file è una pipe

-h

il file è un link simbolico

-L

il file è un link simbolico

-S

il file è un socket

-t

il file (descrittore) è associato ad un terminale

Questa opzione può essere utilizzata per verificare se lo stdin ([ -t 0 ]) o lo stdout ([ -t 1 ]) in un dato script è un terminale.

-r

il file ha il permesso di lettura (per l'utente che esegue la verifica)

-w

il file ha il permesso di scrittura (per l'utente che esegue la verifica)

-x

il file ha il permesso di esecuzione (per l'utente che esegue la verifica)

-g

è impostato il bit set-group-id (sgid) su un file o directory

Se una directory ha il bit sgid impostato, allora un file creato in quella directory appartiene al gruppo proprietario della directory, non necessariamente al gruppo dell'utente che ha creato il file. Può essere utile per una directory condivisa da un gruppo di lavoro.

-u

è impostato il bit set-user-id (suid) su un file

Un file binario di proprietà di root con il bit set-user-id impostato funziona con i privilegi di root anche quando è invocato da un utente comune. [2] È utile con eseguibili (come pppd e cdrecord) che devono accedere all'hardware del sistema. Non impostando il bit suid, questi eseguibili non potrebbero essere invocati da un utente diverso da root.

	      -rwsr-xr-t    1 root       178236 Oct  2  2000 /usr/sbin/pppd
	      
Un file con il bit suid impostato è visualizzato con una s nell'elenco dei permessi.

-k

è impostato lo sticky bit

Comunemente conosciuto come sticky bit, il bit save-text-mode è un tipo particolare di permesso. Se un file ha il suddetto bit impostato, quel file verrà mantenuto nella memoria cache, per consentirne un accesso più rapido. [3] Se impostato su una directory ne limita il permesso di scrittura. Impostando lo sticky bit viene aggiunta una t all'elenco dei permessi di un file o di una directory.

	      drwxrwxrwt    7 root         1024 May 19 21:26 tmp/
	      
Se l'utente non è il proprietario della directory con lo sticky bit impostato, ma ha il permesso di scrittura, in quella directory può soltanto cancellare i file di sua proprietà. Questo impedisce agli utenti di sovrascrivere o cancellare inavvertitamente i file di qualcun altro nelle directory ad accesso pubblico, come, ad esempio, /tmp. (Naturalmente, il proprietario della directory, o root, può cancellare o rinominare i file.)

-O

siete il proprietario del file

-G

l'id di gruppo del file è uguale al vostro

-N

il file è stato modificato dall'ultima volta che è stato letto

f1 -nt f2

il file f1 è più recente del file f2

f1 -ot f2

il file f1 è meno recente del file f2

f1 -ef f2

i file f1 e f2 sono hard link allo stesso file

!

"not" -- inverte il risultato delle precedenti opzioni di verifica (restituisce vero se la condizione è assente).

Esempio 7-4. Ricerca di link interrotti (broken link)

#!/bin/bash
# broken-link.sh
# Scritto da Lee Bigelow <ligelowbee@yahoo.com>
# Utilizzato con il consenso dell'autore.

#  Uno script di pura shell per cercare i link simbolici "morti" e visualizzarli 
#+ tra virgolette, in modo tale che possano essere trattati e dati in pasto a 
#+ xargs  :)    es. broken-link.sh /unadirectory  /altradirectory | xargs rm
#
#Il seguente, tuttavia, è il metodo migliore:
#
#find "unadirectory" -type l -print0|\
#xargs -r0 file|\
#grep "broken symbolic"|
#sed -e 's/^\|: *broken symbolic.*$/"/g'
#
#ma non sarebbe bash pura, come deve essere.
#Prudenza: state attenti al file di sistema /proc e a tutti i link circolari!
#############################################################################


#  Se nessun argomento viene passato allo script, la directory di ricerca 
#+ directorys viene impostata alla directory corrente. Altrimenti directorys 
#+ viene impostata all'argomento passato.
########################################
[ $# -eq 0 ] && directorys=`pwd` || directorys=$@

#  Implementazione della funzione verlink per cercare, nella directory
#  passatale, i file che sono link a file inesistenti, quindi visualizzarli
#+ tra virgolette. Se uno degli elementi della directory è una sottodirectory,
#+ allora anche questa viene passata alla funzione verlink.
##########
verlink () {
    for elemento in $1/*; do
    [ -h "$elemento" -a ! -e "$elemento" ] && echo \"$elemento\"
    [ -d "$elemento" ] && verlink $elemento
    # Naturalmente, '-h' verifica i link simbolici, '-d' le directory.
    done
}

#  Invia ogni argomento passato allo script alla funzione verlink, se è una
#+ directory valida. Altrimenti viene visualizzato un messaggio d'errore e le 
#+ informazioni sull'utilizzo.
#############################
for directory in $directorys; do
    if [ -d $directory ]
	then verlink $directory
	else 
	    echo "$directory non è una directory"
	    echo "Utilizzo: $0 dir1 dir2 ..."
    fi
done

exit 0

Vedi anche Esempio 28-1, Esempio 10-7, Esempio 10-3, Esempio 28-3 e Esempio A-1 che illustrano gli utilizzi degli operatori di verifica di file.

Note

[1]

Dall'edizione del 1913 del Webster's Dictionary:

Deprecare
				      . . .
				      
Scongiurare, es. un male;
cercare di allontanare con preghiere;
desiderare la rimozione di;
cercare la liberazione da;
esprimere profondo rammarico per;
disapprovare fortemente.

[2]

Fate attenzione che il bit suid impostato su file binari (eseguibili) può aprire falle di sicurezza. Il bit suid non ha alcun effetto sugli script di shell.

[3]

Nei moderni sistemi UNIX, lo sticky bit viene utilizzato solo sulle directory e non più sui file.