7.2. Les opérateurs de test de fichiers

Renvoie vrai si...

-e

ce fichier existe

-a

ce fichier existe

Cette option a le même effet que -e mais elles est « obsolète ». [33] Son usage est déconseillé.

-f

ce fichier est un fichier normal (ni un répertoire ni un fichier de périphérique)

-s

la taille de ce fichier est supérieure à zéro

-d

ce fichier est un répertoire

-b

ce fichier est un périphérique de type bloc

-c

le fichier est un périphérique de type caractères

device0="/dev/sda2"    # /   (root directory)
if [ -b "$device0" ]
then
  echo "$device0 est un périphérique de type bloc."
fi

# /dev/sda2 est un périphérique de type bloc.

device1="/dev/ttyS1"   # carte modem PCMCIA
if [ -c "$device1" ]
then
  echo "$device1 est un périphérique de type caractères."
fi

# /dev/ttyS1 est un périphérique de type caractères.
-p

ce fichier est un tube

function affiche_type_entree()
{
   [ -p /dev/fd/0 ] && echo TUBE || echo STDIN
}

affiche_type_entree "Entree"                           # STDIN
echo "Entree" | affiche_type_entree                    # TUBE

# Exemple reproduit avec l'aimable autorisation de Carl Anderson.
-h

ce fichier est un lien symbolique

-L

ce fichier est un lien symbolique

-S

ce fichier est une socket

-t

ce fichier (descripteur) est associé à un terminal

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

-r

ce fichier autorise la lecture (pour l'utilisateur ayant exécuté la commande test)

-w

ce fichier autorise l'écriture (pour l'utilisateur ayant exécuté la commande test)

-x

ce fichier autorise l'exécution (pour l'utilisateur ayant exécuté la commande test)

-g

l'utilisateur dispose de la permission set-group-id (sgid) sur ce fichier ou ce répertoire

Si un répertoire autorise le sgid, alors tout 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. Utile notamment pour un répertoire partagé par un groupe de travail.

-u

l'utilisateur dispose de la permittion set-user-id (suid) sur ce fichier

Un binaire appartenant à root et autorisant le set-user-id sera lancé avec les privilèges de root, même si c'est un utilisateur ordinaire qui l'a lancé en réalité. [34] Cette option est intéressante pour les exécutables (tels que pppd et cdrecord) qui ont besoin d'accéder au matériel du système. Autrement, un utilisateur non privilégié ne pourrait pas s'en servir.

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

Un fichier qui autorise le suid affiche un s dans la liste de ses permissions.

-k

sticky bit mis

Plus connue sous le nom de sticky bit, la permission save-text-mode est un droit très particulier pour les fichiers. Si fichier fournit cette permission, il sera conservé en mémoire cache pour un accès plus rapide. [35] Placé sur un répertoire, il restreint les droits d'écriture. Ajoute un t à la liste des permissions du fichier ou répertoire.

drwxrwxrwt    7 root         1024 May 19 21:26 tmp/
              

Si un répertoire autorise le sticky bit, un utilisateur qui n'en est pas le propriétaire mais qui y dispose des droits d'écriture ne peut supprimer que les fichiers dont il est le propriétaire. Ceci empêche les utilisateurs de supprimer par inadvertance les fichiers des autres utilisateurs. Un exemple de répertoire avec cette permission est /tmp (le propriétaire du répertoire et root peuvent, bien sûr, supprimer et 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 pointant 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 son autorisation.

#  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 $?

Autres exemples d'utilisation des opérateurs de test de fichiers : Exemple 31.1, « Cacher le cookie jar », Exemple 11.7, « Un remplaçant de grep pour les fichiers binaires », Exemple 11.3, « Fileinfo : opérer sur une variable contenant une liste de fichiers », Exemple 31.3, « Créer un disque ram » et Exemple A.1, « mailformat : Formater un courrier électronique ».



[33] 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.

[34] Attention, les binaires suid peuvent causer des failles de. L'option suid n'a aucun effet sur les scripts shell.

[35] Sur les systèmes GNU/Linux, ce droit n'est plus utilisé pour les fichiers mais seulement pour les répertoires.