7.2. Opérateurs de test de fichiers

Renvoie vrai si...

-e

le fichier existe

-a

le fichier existe

Ceci a le même effet que -e mais est « obsolète ». [28] Du coup, son utilisation est déconseillée.

-f

le fichier est un fichier ordinaire (ni un répertoire ni un fichier périphérique)

-s

le fichier a une taille supérieure à zéro

-d

le fichier est un répertoire

-b

le fichier est un périphérique de type bloc (lecteur de disquettes, lecteur de cdroms, etc.)

-c

le fichier est un périphérique de type caractère (clavier, modem, carte son, etc...)

-p

le fichier est un tube nommé

-h

le fichier est un lien symbolique

-L

le fichier est un lien symbolique

-S

le fichier est un socket

-t

le fichier (descripteur) est associé avec un terminal

Cette option permet de tester dans un script si stdin ([ -t 0 ]) ou stdout ([ -t 1 ]) est un terminal.

-r

le fichier dispose du droit de lecture (pour l'utilisateur ayant exécuté la commande)

-w

le fichier dispose du droit d'écriture (pour l'utilisateur ayant exécuté la commande)

-x

le fichier dispose du droit d'exécution (pour l'utilisateur ayant exécuté la commande)

-g

le fichier dispose du droit set-group-id (sgid) sur ce fichier ou répertoire

Si un répertoire dispose du droit sgid, alors un fichier créé dans ce répertoire appartient au groupe du répertoire, et pas nécessairement au groupe de l'utilisateur qui a créé ce fichier. Ceci est utile pour un répertoire partagé par un groupe de travail.

-u

le fichier dispose du droit set-user-id (suid)

Un binaire appartenant à root et disposant du droit set-user-id sera lancé avec les privilèges de root, même si un utilisateur ordinaire l'utilise. [29] C'est intéressant pour les exécutables (tels que pppd et cdrecord) qui ont besoin d'accéder au matériel du système. Sans cette option, ces binaires ne pourraient pas être utilisés par un utilisateur ordinaire.

              -rwsr-xr-t    1 root       178236 Oct  2  2000 /usr/sbin/pppd
              

Un fichier disposant du droit suid affiche un s dans ses droits.

-k

sticky bit mis

Habituellement connu sous le nom de sticky bit, le droit save-text-mode est un droit très particulier pour les fichiers. Si un fichier en dispose, celui-ci sera conservé en mémoire cache, pour un accès plus rapide. [30] Placé sur un répertoire, il restreint les droits d'écriture. Cela ajoute un t aux droits du fichier ou du répertoire.

              drwxrwxrwt    7 root         1024 May 19 21:26 tmp/
              

Si un utilisateur ne possède pas un répertoire qui dispose du droit sticky bit, mais qu'il a le droit d'écriture sur ce répertoire, il peut seulement supprimer les fichiers dont il est le propriétaire. Ceci empêche les utilisateurs de supprimer par inadvertance les fichiers des autres utilisateurs. Un répertoire disposant de ce droit est par exemple /tmp (le propriétaire du répertoire et root peuvent, bien sûr, supprimer ou renommer les fichiers).

-O

vous êtes le propriétaire du fichier

-G

vous faites partie du groupe propriétaire du fichier

-N

le fichier a été modifié depuis sa dernière lecture

f1 -nt f2

le fichier f1 est plus récent que le fichier f2

f1 -ot f2

le fichier f1 est plus ancien que le fichier f2

f1 -ef f2

le fichier f1 et le fichier f2 sont des liens physiques vers le même fichier

!

« not » -- inverse le sens des tests précédents (renvoie vrai si la condition est fausse).

Exemple 7.4. Test de liens cassés

#!/bin/bash
# broken-link.sh
# Écrit par Lee bigelow <ligelowbee@yahoo.com>
# Utilisé dans le guide ABS avec sa permission.

#  Un pur script shell pour trouver des liens symboliques morts et les afficher
#+ entre guillemets pour qu'ils puissent être envoyés à xargs et être ainsi mieux
#+ gérés :) 
#  eg. sh broken-link.sh /repertoire /autrerepertoire|xargs rm
#
#  Néanmoins, ceci est une meilleure méthode :
#
#  find "repertoire" -type l -print0|\
#  xargs -r0 fichier|\
#  grep "lien symbolique mort"|
#  sed -e 's/^\|: *lienmort.*$/"/g'
#
#+ mais cela ne serait pas du bash pur.
#  Attention au système de fichiers /proc et aux liens circulaires !
##############################################################


#  Si aucun argument n'est passé au script, initialise repertoires au répertoire
#+ courant. Sinon, initialise repertoires aux arguments passés.
###############################################################

[ $# -eq 0 ] && repertoires=`pwd` || repertoires=$@

#  Configure la fonction verifliens pour vérifier si le répertoire en argument
#+ ne contient pas de liens morts et pour les afficher.
#  Si un des éléments du répertoire est un sous-répertoire, alors envoie ce
#+ sous-répertoire à la fonction verifliens.
############################################

verifliens () {
    for element in $1/*; do
    [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
    [ -d "$element" ] && verifliens $element
    # Bien sûr, '-h' teste les liens symboliques, '-d' les répertoires.
    done
}

#  Envoie chaque argument qui a été passé au script à la fonction verifliens
#+ s'il s'agit d'un répertoire validé. Sinon, affiche un message d'erreur et
#+ le message d'usage.
######################
for repertoire in $repertoires; do
    if [ -d $repertoire ]
        then verifliens $repertoire
        else 
            echo "$repertoire n'est pas un répertoire"
            echo "Usage: $0 repertoire1 repertoire2 ..."
    fi
done

exit $?

L'Exemple 28.1, « Cacher le cookie jar », l'Exemple 10.7, « Un remplaçant de grep pour les fichiers binaires », l'Exemple 10.3, « Fileinfo : opérer sur une liste de fichiers contenue dans une variable », l'Exemple 28.3, « Créer un disque ram » et l'Exemple A.1, « mailformat : Formater un courrier électronique » illustrent aussi l'utilisation des opérateurs de test de fichiers.



[28] D'après l'édition 1913 du Dictionnaire Webster :

Deprecate


To pray against, as an evil;
to seek to avert by prayer;
to desire the removal of;
to seek deliverance from;
to express deep regret for;
to disapprove of strongly.

[29] Faites attention que les binaires suid peuvent apporter des failles de sécurité et que l'option suid n'a pas d'effet sur les script shell.

[30] Sur les systèmes UNIX modernes, ce droit n'est plus utilisé sur les fichiers, mais seulement sur les répertoires.