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.