NOM
find - Rechercher des fichiers dans une hiérarchie de répertoires
SYNOPSIS
find [-H] [-L] [-P] [-D option-debogage] [-Oniveau] [chemin...]
[expression]
Cette page de manuel documente la version GNU de find. GNU find
parcourt les arborescences des répertoires de chacun des chemins
mentionnés, en évaluant les expressions fournies pour chaque fichier
rencontré. L’évaluation de l’expression se fait de gauche à droite, en
suivant les règles de priorité décrites dans la section OPÉRATEURS,
jusqu’à l’obtention du résultat (par exemple la partie gauche est
fausse pour un opérateur et, vraie pour un opérateur ou), puis find
passe au nom de fichier suivant.
Si vous utilisez find dans un environnement dans lequel la sécurité est
importante (si vous l’utilisez par exemple pour faire des recherches
dans des répertoires qui sont accessibles en écriture à d’autres
utilisateurs), vous devriez lire le chapitre « Security
Considerations » de la documentation de findutils. Cette documentation,
fournie par findutils, s’appelle Finding Files (en anglais). Elle
contient bien plus de détails et d’explications que cette page de
manuel, et peut donc être considérée comme une source d’informations
plus utile.
OPTIONS
Les options -H, -L et -P contrôlent le traitement des liens
symboliques. Les paramètres de la ligne de commande qui les suivent
sont considérés comme des fichiers ou des répertoires à examiner, et ce
jusqu’au premier paramètre qui commence par « - », « ( » ou « ! ». Ce
paramètre, et tous ceux qui suivent, sont considérés comme décrivant ce
qui doit être recherché. Si aucun chemin n’est précisé, c’est le
répertoire courant qui est utilisé. Si aucune expression n’est donnée,
c’est l’ordre -print qui est utilisé (quoi qu’il en soit, vous devriez
plutôt utiliser -print0).
Cette page de manuel décrit les « options » contenues dans la liste
d’expressions. Ces options contrôlent le comportement de find mais sont
indiquées immédiatement après le dernier chemin. Les cinq options
«réelles » -H, -L, -P, -D et -O doivent être saisies avant le premier
chemin, le cas échéant. Un double tiret -- pourra être utilisé afin
d’indiquer que les arguments restants ne sont pas des options (sachant
qu’il est en général plus sûr de faire commencer les chemins de
recherche par « ./ » ou « / » lorsque vous utilisez des jokers).
-P Ne jamais suivre les liens symboliques, ce qui est le
comportement par défaut. Quand find analyse ou affiche les
informations concernant un fichier, et que ce fichier est un
lien symbolique, les informations utilisées sont celles qui
concernent le lien symbolique lui-même (et non le fichier
pointé).
-L Suivre les liens symboliques. Quand find analyse ou affiche les
informations concernant un fichier, ce sont celles extraites des
caractéristiques du fichier vers lequel mène les liens, et non
celle du lien lui-même (sauf s’il s’agit d’un lien cassé, ou si
find est incapable d’analyser le fichier vers lequel pointe le
lien). L’utilisation de cette option implique -noleaf qui sera
toujours active pour les utilisations ultérieures de l’option
-P. Si l’option -L est active et que find découvre un lien
symbolique vers un sous-répertoire lors de ses recherches, le
sous-répertoire pointé par le lien symbolique sera examiné.
Quand l’option -L est active, le prédicat -type correspondra
toujours au type du fichier pointé par le lien symbolique plutôt
que celui du lien lui-même (sauf si le lien symbolique est
cassé). Les prédicats -lname et -ilname renvoient toujours faux
lors de l’utilisation de -L.
-H Ne pas suivre les liens symboliques, sauf pour le traitement des
paramètres de la ligne de commande. Quand find analyse ou
affiche les informations concernant un fichier, celles qui sont
utilisées viennent des propriétés du lien symbolique lui même
(et non du fichier pointé). La seule exception à ce comportement
est lorsqu’un fichier indiqué sur la ligne de commande est
lui-même un lien symbolique, et que ce lien peut être résolu.
Dans ce cas, les informations traitées sont celles du fichier
pointé par le lien (autrement dit, le lien est suivi). Les
informations concernant le lien lui-même sont utilisées en
dernier recours, si le fichier pointé par le lien symbolique ne
peut être analysé. Si l’option -H est active, et que l’un des
liens indiqués sur la ligne de commande est un lien symbolique
pointant vers un répertoire, le contenu de ce répertoire sera
analysé (sachant bien sûr que l’option -maxdepth 0 l’en
empêcherait).
Si plus d’une option parmi -H, -L ou -P est indiquée, chacune écrase
les précédentes, et c’est la dernière qui apparaît sur la ligne de
commande qui prime sur les autres. Puisque c’est l’option par défaut,
on considère que c’est -P qui est active, à moins que -H ou -L ne
soient utilisées.
La version find du GNU évalue souvent des fichiers pendant l’analyse de
la ligne de commande, et ce avant qu’une recherche n’ait commencée. Ces
options modifient aussi la façon dont les paramètres sont traités. Plus
précisément, il existe un certain nombre de tests qui comparent les
fichiers listés sur la ligne de commande et le fichier en cours
d’analyse. Dans tous les cas de figure, un fichier de la ligne de
commande a été analysé et certaines de ses caractéristiques ont été
mémorisées. Si le fichier indiqué est en fait un lien symbolique, et
que l’option -P est active (ou que ni -H ni -L n’ont été précisées),
alors l’information qui sera utilisée pour les comparaisons sera
extraite des propriétés du lien symbolique. Sinon, elle sera extraite
des propriétés du fichier pointé par le lien. Si find ne peut suivre le
lien (soit parce ce qu’il ne dispose pas des privilèges suffisants,
soit parce que le lien pointe vers un fichier inexistant), alors ce
sont les propriétés du lien lui-même qui seront utilisées.
Quand les options -H ou -L sont actives, tout lien symbolique donné
comme paramètre à -newer sera déréférencé, et le timestamp utilisé sera
celui du fichier pointé par le lien symbolique. Ceci s’applique de la
même façon à -newerXY, -anewer et -cnewer.
L’option -follow a le même effet que -L, sauf qu’elle agit à l’endroit
où elle apparaît (c’est à dire que si -L n’est pas utilisée et que
-follow l’est, tout lien symbolique qui apparaît sur la ligne de
commande après -follow sera déréférencé, et ceux apparaissant avant ne
le seront pas).
-D options-debogage
Afficher des informations de diagnostic, ce qui peut être
pratique pour analyser pourquoi find ne fait pas ce que vous lui
demandez. La liste des options de debogage devra utiliser des
virgules comme séparateurs. La compatibilité des options de
debogage n’est pas garantie au fil des versions de findutils. La
sortie de find -D help permet d’obtenir la liste complète des
options reconnues. Les options de debogage valides comportent
help Décrire les options de debogage.
tree Afficher l’arbre de l’expression dans sa forme d’origine
et sa forme optimisée.
stat Afficher des messages dès que des fichiers sont examinés
via les appels systèmes stat et lstat. Le programme find
tente de limiter ce type d’appels.
opt Afficher des informations de diagnostic liées à
l’optimisation de l’arbre de l’expression (voir l’option
-O).
rates Afficher un résumé indiquant le nombre de succès ou
d’échecs de chacun des prédicats.
-Oniveau
Activer l’optimisation des requêtes. Le programme find
réorganise l’ordre des tests afin d’en accélérer l’exécution
tout en préservant le résultat exact, c’est-à-dire en évitant de
modifier ceux qui ont des effets de bords. Les optimisations
réalisées à chacun des niveaux sont les suivantes.
0 Équivalent au niveau 1 d’optimisation.
1 Niveau d’optimisation par défaut. Il correspond au
comportement habituel. Les expressions sont réorganisées
afin que les tests basés seulement sur les noms (comme
-name ou -regex par exemple) soient exécutés en premier.
2 Tous les tests -type ou -xtype sont exécutés après ceux
basés uniquement sur le nom des fichiers, mais avant tous
les tests qui traitent d’informations stockées dans
l’inode. Sur les versions modernes d’Unix, les types de
fichiers sont récupérés par readdir(), et sont donc plus
rapides à évaluer que ceux qui nécessitent de travailler
d’abord sur le fichier.
3 Dans ce niveau d’optimisation, l’optimiseur de requêtes
basé sur le coût total est activé. L’ordre des tests est
modifié afin que les tests les moins coûteux
(c’est-à-dire les plus rapides) soient exécutés en
premier, et les plus coûteux exécutés plus tard, si
besoin est. À l’intérieur d’un même niveau de coût, les
prédicats sont évalués plus ou moins tôt selon leur
probabilité de succès. Avec l’opérateur -o, les prédicats
qui sont susceptibles de réussir sont évalués plus tôt,
et avec l’opérateur -a, ce sont ceux qui risquent
d’échouer qui sont évalués plus tôt.
L’optimiseur basé sur le coût a une idée précise des chances de
succès de n’importe quel test. Dans certains cas, cette
probabilité prend en compte la nature spécifique du test (par
exemple, l’estimation de succès d’un -type f est supérieure à
celle d’un -type c). L’optimiseur basé sur le coût est
actuellement en cours d’évaluation. S’il n’améliore pas les
performances de find, il sera de nouveau retiré. Réciproquement,
les optimisations qui s’avèrent fiables, robustes et efficaces
pourront dans l’avenir être activées à des niveaux
d’optimisations moindres. Toutefois, le comportement par défaut
(c’est à dire le niveau d’optimisation 1) ne sera pas modifié
dans les différentes versions de la série 4.3.x. La suite de
tests unitaires de findutils est exécutée sur chacun des niveaux
d’optimisation de find afin de s’assurer que le résultat est
constant.
EXPRESSIONS
L’expression est constituée d’options (affectant l’ensemble des
opérations plutôt que le traitement d’un fichier particulier, et
renvoyant toujours vrai), de tests (renvoyant une valeur vraie ou
fausse), et d’actions (ayant des effets de bords et renvoyant une
valeur vraie ou fausse), tous ces éléments étant séparés par des
opérateurs. Quand un opérateur est manquant, l’opération par défaut
-and est appliquée.
Si l’expression ne contient pas d’action autre que -prune, find
applique l’action -print par défaut à tous les fichiers pour lesquels
l’expression est vraie.
OPTIONS
Toutes les options renvoient toujours la valeur vraie. Excepté pour
-daystart, -follow et -regextype, elles ont toujours un effet global,
même sur les tests indiqués avant l’option. En effet, les options sont
traitées au moment où la ligne de commande est analysée, tandis que les
tests ne font rien avant que les fichiers ne soient examinés. Les
options -daystart, -follow et -regextype sont différentes à cet égard,
et ne s’appliqueront que sur les tests qui apparaissent plus tard sur
la ligne de commande. De ce fait, pour améliorer la lisibilité, il est
préférable de les placer au début de l’expression. Vous recevrez un
avertissement dans les autres cas.
-d Un synonyme de -depth, dans un but de compatibilité avec
FreeBSD, NetBSD, MacOS X et OpenBSD.
-daystart
Mesurer les temps (avec -amin, -atime, -cmin, -ctime, -mmin, et
-mtime) depuis le début de la journée plutôt que depuis 24
heures. Cette option n’affecte que les tests qui sont indiqués
plus loin sur la ligne de commande.
-depth Traiter d’abord les sous-répertoires avant le répertoire
lui-même. L’action delete implique aussi -depth.
-follow
Obsolète, utilisez plutôt l’option -L à la place. Déréférence
les liens symboliques. Ceci implique l’option -noleaf. L’option
-follow n’affecte que les tests qui apparaissent après son
apparition sur la ligne de commande. Sauf dans le cas où
l’option -H ou -L est indiquée, la position de l’option -follow
change le comportement du prédicat -newer, et tout fichier donné
en paramètre de -newer sera déréférencé s’il s’agit d’un lien
symbolique. La même remarque s’applique à -newerXY, -anewer et
-cnewer. De la même façon, le prédicat -type correspondra
toujours au type du fichier pointé par le lien symbolique plutôt
que le type du lien lui-même. Les prédicats -lname et -ilname
renvoient toujours faux lorsqu’on utilise -follow.
-help, --help
Afficher un message d’aide concernant l’utilisation de find sur
la sortie standard et quitter.
-ignore_readdir_race
Normalement, find affiche un message d’erreur quand il échoue
lors de l’analyse d’un fichier. Si vous utilisez cette option et
que le fichier est effacé entre le moment où find lit le nom du
fichier dans le répertoire et celui où il essaye de l’analyser,
vous n’obtiendrez aucun message d’erreur. Cela s’applique aussi
aux fichiers et répertoires dont vous avez donné les noms sur la
ligne de commande. Cette option prend effet dès le moment où la
ligne de commande est lue, ce qui veut dire que vous ne pouvez
pas rechercher sur une partie du système de fichiers avec cette
option activée, et sur une autre partie avec cette option
désactivée (si vous devez faire cela, vous utiliserez plutôt
deux commandes find, une avec l’option et l’autre sans).
-maxdepth n
Descendre au plus à n niveaux de profondeur des répertoires (n
étant un entier positif ou nul), dans les paramètres fournis sur
la ligne de commande. -maxdepth 0 signifie que les tests et les
actions ne s’appliquent qu’aux paramètres de la ligne de
commande.
-mindepth n
Ne pas appliquer les tests ou les actions à des niveaux de
profondeur inférieurs à n. n est un entier positif ou nul.
-mindepth 1 signifie que les tests et les actions s’appliquent à
tous les fichiers sauf aux paramètres de la ligne de commande.
-mount Ne pas parcourir les répertoires situés sur d’autres systèmes de
fichiers. Il s’agit d’une alternative à l’option -xdev, assurant
la compatibilité avec d’anciennes versions de find.
-noignore_readdir_race
Désactiver l’effet de -ignore_readdir_race.
-noleaf
Ne pas optimiser, en ignorant que les répertoires sont supposés
contenir deux sous-répertoires de moins que leur nombre de liens
physiques. Cette option est nécessaire lorsque l’on parcourt des
systèmes de fichiers ne suivant pas les conventions Unix
concernant les liens de répertoires, comme les systèmes MS-DOS,
les CD-ROM ou les points de montage de volumes AFS. Chaque
répertoire sur un système de fichiers Unix dispose d’au moins
deux liens physiques, son nom et « . ». De plus, chaque
sous-répertoire a également un lien « .. » vers le répertoire
parent (s’il existe). Quand find examine un répertoire, il sait
qu’il y a deux sous-répertoires de moins que de liens vers le
répertoire. Une fois qu’il a rencontré le nombre prévu de
sous-répertoires, il est donc sûr que le reste des entrées est
constitué de fichiers autres que des sous-répertoires. Ces
fichiers sont des feuilles ([NDT] « leaf ») dans l’arborescence
des répertoires. S’il n’y a que les noms de fichiers à examiner,
il n’a plus besoin de vérifier leur nature, ce qui entraîne une
augmentation notable de la vitesse de traitement.
-regextype type
Définir la syntaxe des expressions rationnelles des tests -regex
et -iregex qui seront indiqués plus loin sur la ligne de
commande. Les types actuellement implémentés sont emacs (type
par défaut), posix-awk, posix-basic, posix-egrep et
posix-extended.
-version, --version
Afficher le numéro de version de find et quitter.
-warn, -nowarn
Activer ou désactiver les messages d’avertissement. Ces messages
d’avertissement concernent l’usage de la ligne de commande, et
non les événements que find peut rencontrer lorsqu’il explore
les répertoires. Le comportement par défaut est d’activer -warn
si l’entrée standard est un tty, et -nowarn dans les autres cas.
-xdev Ne pas parcourir les répertoires situés sur d’autres systèmes de
fichiers.
TESTS
Quelques tests (comme -newerXYet -samefile par exemple) permettent de
comparer le fichier en cours d’examen et un fichier de référence
indiqué sur la ligne de commande. Quand ces tests sont utilisés,
l’analyse du fichier de référence est soumis aux effets des options -H,
-L , -P et tout -follow précédent. Par contre, ce fichier de référence
n’est consulté qu’une fois, au moment où la ligne de commande est
interprétée. Si ce fichier de référence ne peut pas être analysé (par
exemple si l’appel système stat(2) échoue), un message d’erreur sera
généré, et la commande find s’interrompera avec un statut différent de
zéro.
Les paramètres numériques peuvent être indiqués comme suit :
+n supérieur à n,
-n inférieur à n,
n strictement égal à n.
-amin n
Dernier accès au fichier il y a n minutes.
-anewer fichier
Dernier accès au fichier plus récent que la dernière
modification de fichier. Si le fichier est un lien symbolique et
que les options -H ou -L sont actives, c’est toujours la date de
dernier accès du fichier pointé qui est utilisée.
-atime n
Dernier accès au fichier il y a n*24 heures. Lorsque find
calcule le nombre de périodes de 24 heures depuis lequel le
fichier a été accédé, la partie fractionnelle est ignorée.
Ainsi, pour correspondre à -atime +1, un fichier doit avoir été
accédé il y a au moins deux jours.
-cmin n
Date de dernière modification du statut du fichier il y a n
minutes.
-cnewer fichier
Date de dernière modification du statut du fichier plus récente
que la date de dernière modification du fichier donné. Si le
fichier donné est un lien symbolique et que les options -H ou -L
sont actives, alors c’est la date de dernière modification du
statut du fichier pointé par le lien qui est considérée.
-ctime n
Date de dernière modification du statut du fichier il y a n*24
heures. Consultez l’explication concernant -atime pour
comprendre comment les effets d’arrondis altèrent
l’interprétation de la date de dernière modification du statut
du fichier.
-empty Fichier vide. De plus, ce fichier doit être régulier ou être un
répertoire.
-executable
Correspond aux fichiers qui sont exécutables et aux répertoires
qui sont accessibles (en ce qui concerne la résolution d’un nom
de fichier). Les listes de contrôles d’accès (ACL) et autres
artefacts de permissions sont pris en compte, à l’inverse du
test -perm qui lui les ignore. Ce test utilise l’appel système
access(2) et peut de ce fait être trompé par les serveurs NFS
qui font de la substitution d’identité (ou du root squashing).
En effet, de nombreux systèmes implémentent access(2) au niveau
du client, et ne peuvent donc se servir des substitutions
d’identité gérées du coté serveur. Puisque ce test n’est basé
que sur le résultat fourni par l’appel système access(2), il n’y
a aucune garantie qu’un fichier trouvé par ce test soit
réellement exécutable.
-false Toujours faux.
-fstype type
Fichier se trouvant sur un système de fichiers du type indiqué.
Les types valides de systèmes de fichiers dépendent de la
version d’Unix. Une liste non exhaustive des systèmes acceptés
sur certaines versions d’Unix sont : ufs, 4.2, 4.3, nfs, tmp,
mfs, S51K, S52K. Vous pouvez utiliser -printf avec la directive
%F pour examiner les types de vos systèmes de fichiers.
-gid n Fichier de GID numérique valant n.
-group nom_groupe
Fichier appartenant au groupe nom_groupe (éventuellement un
identifiant numérique).
-ilname motif
Semblable à -lname, mais sans différencier les majuscules et les
minuscules. Si les options -L ou -follow sont actives, ce test
renvoie toujours faux, à moins que le lien symbolique ne soit
cassé.
-iname motif
Semblable à -name, mais sans différencier les majuscules et les
minuscules. Par exemple les motifs « to* » et « T??? »
correspondent aux noms de fichiers « Toto », « TOTO », « toto »,
« tOto », etc. Dans ces motifs, et contrairement à l’expansion
des noms de fichiers de l’interpréteur de commandes, un « . »
initial peut correspondre au motif « * ». Ainsi, find -name *to
acceptera le fichier « .toto ». Notez bien que vous devez
protéger les motifs, cela va sans dire, car sinon,
l’interpréteur de commandes appliquera l’expansion aux
métacaractères qu’ils contiennent.
-inum n
Fichier dont le numéro d’inode est n. Il est en général plus
facile d’utiliser le test -samefile.
-ipath motif
Se comporter comme -iwholename. Cette option est obsolète,
veuillez ne plus l’utiliser.
-iregex motif
Semblable à -regex, mais sans différencier les majuscules et les
minuscules.
-iwholename motif
Semblable à -wholename, mais la recherche n’est pas sensible à
la casse.
-links n
Fichier ayant n liens.
-lname motif
Fichier représentant un lien symbolique, dont le contenu
correspond au motif indiqué. Lors du développement des
métacaractères, « / » et « .» ne sont pas traités différemment
des autres caractères. Si les options -L ou -follow sont
actives, ce test renvoie faux, sauf si le lien symbolique est
cassé.
-mmin n
Fichier dont les données ont été modifiées il y a n minutes.
-mtime n
Fichier dont les données ont été modifiées il y a n*24 heures.
Consultez l’explication sur -atime pour comprendre comment les
arrondis affectent l’interprétation des dates de dernière
modification des fichiers.
-name motif
Fichier dont le nom de base (sans les répertoires du chemin
d’accès), correspond au motif du shell. Les métacaractères
(« * », « ? », et «[] ») peuvent correspondre à un point « . »
au début du nom du fichier (c’est une évolution de
findutils-4.2.2, consultez la section CONFORMITÉ AUX STANDARDS
plus loin). Pour ignorer un répertoire, ainsi que tous ses
fichiers, utilisez l’option -prune (vous trouverez un exemple
dans la description de l’option -path). Les parenthèses ne sont
pas considérées comme des caractères spéciaux, bien que certains
interpréteurs de commandes (dont le Bash) attribuent aux
parenthèses un rôle particulier. La correspondance avec le nom
du fichier est obtenue par l’utilisation de la fonction
fnmatch(3) de la bibliothèque. N’oubliez pas de protéger votre
motif entre guillemets afin d’éviter l’expansion des
métacaractères par l’interpréteur de commandes.
-newer fichier
Fichier modifié plus récemment que le fichier indiqué. Si le
fichier fichier est un lien symbolique et que les options -H ou
-L sont actives, c’est la date de modification du fichier pointé
qui sera considérée.
-newerXY rfrence
Compare le timestamp du fichier courant avec la rfrence.
L’argument rfrence est habituellement un nom de fichier (dans
ce cas, un de ses timestamps est utilisé pour les comparaisons),
mais il peut aussi s’agir d’une chaîne donnant un temps absolu.
X et Y sont des emplacements pour d’autres lettres, lettres qui
indiquent quel horodatage de la rfrence est utilisé pour la
comparaison.
a La date et l’heure de dernier accès au fichier rfrence
B La date et l’heure de création du fichier rfrence
c La date et l’heure de changement d’état de l’inode rfrence
m La date et l’heure de dernière modification du fichier rfrence
t rfrence est directement interprétée en tant qu’heure
Certaines combinaisons ne sont pas valables, comme par exemple,
X utilisé avec t. Certaines combinaisons ne sont pas
implémentées sur certains systèmes, comme par exemple B qui
n’est pas supportée par tous les systèmes. Une erreur fatale
sera retournée si une combinaison non valable ou non implémentée
de XY est appelée. Les dates et heures sont interprétées comme
les arguments de l’option -d de la commande date du GNU. Si
vous essayez d’utiliser la date de création d’un fichier, et que
cette date de création ne peut pas être déterminée, vous
obtiendrez un message d’erreur fatale. Si vous spécifiez un test
qui se réfère à la date de création des fichiers à examiner, ce
test échouera pour chaque fichier pour lequel la date de
création est inconnue.
-nogroup
Fichier dont l’identifiant de groupe numérique ne correspond à
aucun groupe d’utilisateurs.
-nouser
Fichier dont l’UID numérique ne correspond à aucun utilisateur.
-path motif
Fichier dont le nom correspond au motif motif. Les
métacaractères « / » ou « . » ne sont pas interprétés, d’où, par
exemple,
find . -path "./sr*sc"
affichera un résultat pour un répertoire appelé « ./src/misc »
(s’il existe). Pour omettre une branche complète de répertoires,
utilisez -prune plutôt que de vérifier chaque fichier de
l’arborescence. Pour ignorer par exemple le répertoire
« src/emacs » et tous ces fichiers et sous-répertoires tout en
affichant le nom des autres fichiers trouvés, faites quelque
chose comme :
find . -path ’./src/emacs’ -prune -o -print
Sachez que le motif de recherche de correspondance s’applique
sur le nom complet du fichier, en commençant des points de
départ indiqués sur la ligne de commande. L’utilisation d’un
chemin absolu n’a de sens ici que si le point de départ de
recherche est lui aussi un chemin absolu. Cela signifie que la
commande suivante ne trouvera jamais rien :
find bar -path /truc/bidule/monFichier -print
Le prédicat -path est aussi implémenté dans le find d’HP-UX et
apparaîtra dans une prochaine version du standard POSIX.
-perm mode
Fichier dont les autorisations d’accès sont fixées exactement au
mode indiqué (en notation symbolique ou octale). Puisqu’une
correspondance stricte est requise, vous risquez d’être obligés
d’utiliser une chaîne de caractères plutôt compliquée lorsque
vous utiliserez cette option avec le mode symbolique. -perm g=w,
par exemple, ne recherchera que les fichiers qui ont le mode
0020 (c’est à dire, ceux pour lesquels la permission d’écriture
pour le groupe est la seule permission définie). Vous voudrez
plus certainement utiliser les formes « / » ou « - », telles que
-perm -g=w, qui correspondent à tous les fichiers qui ont le
droit d’écriture pour les groupes. Consultez la section EXEMPLES
pour des exemples plus significatifs.
-perm -mode
Fichier ayant tous les bits d’autorisations indiqués dans le
mode. Les notations symboliques sont acceptées dans ce cas, et
c’est en général comme cela que l’on veut s’en servir. Vous
devez indiquer « u », « g » ou «o » si vous utilisez un mode
symbolique. Consultez la section EXEMPLES pour des exemples plus
significatifs.
-perm /mode
Fichier ayant certains des bits d’autorisations indiqués dans le
mode. La notation symbolique est acceptée dans ce cas. Vous
devez indiquer « u », « g » ou « o » si vous utilisez un mode
symbolique. Consultez la section EXEMPLES pour des exemples plus
significatifs. Si aucun bit d’autorisation n’est indiqué dans
mode, cela correspond à tous les fichiers (l’objectif est
d’être plus cohérent avec le comportement de perm -000).
-perm +mode
Déconseillé, ancienne méthode pour rechercher des fichiers ayant
certains des bits d’autorisations indiqués dans le mode. Vous
devez plutôt utiliser -perm /mode. L’utilisation de la syntaxe
« + » avec la notation symbolique vous réservera des résultats
surprenants. Par exemple, « +u+x » est une notation symbolique
valide (équivalente à +u,+x, c’est-à-dire 0111) qui ne sera donc
pas évaluée en tant que -perm +mode, mais plutôt comme l’option
de recherche exacte -perm mode. Cela correspondra donc aux
fichiers avec la permission « 0111 » précisément, et non ceux
qui ont n’importe quel bit d’exécution activé. Si vous ne
trouvez pas ce paragraphe clair, vous n’êtes pas le seul.
Utilisez plutôt -perm /mode. Cet emploi du test -perm est
déconseillé parce que la spécification POSIX requiert
l’interprétation du premier « + » en tant que partie de la
notation symbolique. Nous avons donc préféré l’utilisation de
« / ».
-readable
Correspond aux fichiers qui sont accessibles en lecture. Les
listes de contrôle d’accès (ACL) et les autres artefacts de
permissions sont pris en compte, à l’inverse du test -perm qui,
lui, les ignore. Ce test utilise l’appel système access(2), et
peut, de ce fait, être trompé par les serveurs NFS qui font de
la substitution d’identité (UID mapping ou root squashing). En
effet, de nombreux systèmes implémentent access(2) au niveau du
client, et ne peuvent donc se servir des substitutions
d’identités gérées du coté serveur.
-regex motif
Nom de fichier correspondant à l’expression rationnelle motif.
Il s’agit d’une correspondance sur le chemin complet, pas d’une
recherche. Par exemple, pour mettre en correspondance un fichier
nommé « ./fubar3 », vous pouvez utiliser les expressions
rationnelles « .*bar. » ou « .*b.*3 », mais pas « f.*r3 ». Les
expressions rationnelles comprises par find sont, par défaut,
celles d’Emacs. L’option -regextype permet d’en changer.
-samefile nom
Fichier qui se réfère à la même inode que nom. Quand -L est
actif, cela inclut les liens symboliques.
-size n[cwbkMG]
Fichier utilisant n unités d’espace. On pourra utiliser les
suffixes suivants :
« b » Pour des blocs de 512 octets (comportement par défaut si
rien n’est indiqué).
« c » Pour indiquer des octets.
« w » Pour des mots de deux octets.
« k » Pour des kilo-octets (unités de 1 024 octets).
« M » Pour des méga-octets (unités de 1 048 576 octets).
« G » Pour des giga-octets (unités de 1 073 741 824 octets).
La taille ne prend pas en compte les blocs indirects, mais elle
comptabilise les blocs des fichiers creux non encore alloués.
Gardez à l’esprit que les spécifications de format « %k » et
« %b » de -printf gèrent différemment les fichiers éparpillés.
Le suffixe « b » détermine toujours des blocs de 512 octets et
jamais de 1 kilo-octets, ce qui diffère du comportement de -ls.
-true Toujours vrai.
-type c
Fichier du type c :
b Fichier spécial en mode bloc (avec tampon)
c Fichier spécial en mode caractère (sans tampon)
d Répertoire
p Tube nommé (FIFO)
f Fichier régulier
l Lien symbolique, n’est jamais vrai si les options -L ou
-follow sont actives, à moins que le lien symbolique ne
soit cassé. Si vous voulez rechercher des liens
symboliques alors que -L est actif, utilisez -xtype.
s Socket
D Door (Solaris)
-uid n Fichier dont l’identifiant utilisateur numérique vaut n.
-used n
Fichier dont le dernier accès date de n jours après sa date de
dernière modification.
-user utilisateur
Fichier appartenant à l’utilisateur indiqué (identifiant
utilisateur numérique éventuellement).
-wholename motif
Voir -path. Cette option est moins portable que -path.
-writable
Correspond aux fichiers qui sont accessibles en écriture. Les
listes de contrôle d’accès (ACL) et les autres artefacts de
permissions sont pris en compte, à l’inverse du test -perm qui,
lui, les ignore. Ce test utilise l’appel système access(2), et
peut, de ce fait, être trompé par les serveurs NFS qui font de
la substitution d’identité (UID mapping ou root squashing). En
effet, de nombreux systèmes implémentent access(2) au niveau du
client, et ne peuvent donc se servir des substitutions
d’identités gérées du coté serveur.
-xtype c
Semblable à -type sauf si le fichier est un lien symbolique.
Pour les liens symboliques, si les options -H ou -P ont été
spécifiées, le test est vrai si le fichier pointé par le lien
est de type c ; si l’option -L a été spécifiée, le test est vrai
si c vaut « l ». Autrement dit, pour les liens symboliques,
-xtype vérifie le type des fichiers que l’option -type ne
vérifie pas.
ACTIONS
-delete
Effacer les fichiers, et renvoyer vrai si l’effacement a réussi.
Si l’effacement échoue, un message d’erreur est envoyé. Si
-delete échoue, le statut de sortie de find sera différent de
zéro (si jamais il s’interrompt). L’utilisation de l’action
-delete active automatiquement l’option -depth.
Attention : N’oubliez pas que la ligne de commande de find est
évaluée comme une expression. Écrire -delete en premier forcera
find à essayer d’effacer tout ce qui se trouve dans les points
de départ que vous avez indiqué. Lorsque vous testez une ligne
de commande de find qui utilisera -delete, vous devriez préciser
l’option -depth afin d’éviter les surprises plus tard. Puisque
-delete entraîne -depth, vous ne pouvez pas utiliser en même
temps -prune et -delete.
-exec commande ;
Exécuter la commande ; vrai si le code de retour 0 est renvoyé.
Tous les paramètres qui suivent find sont considérés comme des
paramètres pour la ligne de commande, jusqu’à la rencontre d’un
caractère « ; ». La chaîne «{} » est remplacée par le nom du
fichier en cours de traitement, ceci dans toutes ses occurrences
sur la ligne de commande, et pas seulement aux endroits où elle
est isolée, comme c’est le cas avec d’autres versions de find.
Ces deux chaînes peuvent avoir besoin d’être protégées du
développement de la ligne de commande par le shell, en utilisant
le caractère d’échappement (« \ ») ou une protection par des
guillemets. Consultez la section EXEMPLES pour des exemples
d’utilisation de l’option -exec. La commande indiquée est
exécutée à chaque fois qu’un fichier correspond. La commande est
exécutée depuis le répertoire de départ. Il existe d’inévitables
problèmes de sécurité associés à l’usage de l’option -exec,
c’est pourquoi vous devriez utiliser l’option -execdir à la
place.
-exec commande {} +
Cette variante de l’option -exec exécute la commande spécifiée
sur le fichier sélectionné, mais en ajoutant le nom de chaque
fichier trouvé à la fin de la ligne de commande. Le nombre total
d’invocation de la commande sera donc très inférieur au nombre
de fichiers trouvés. La ligne de commande est construite à la
manière de xargs. Une seule instance de « {} » est permise à
l’intérieur de la commande. La commande sera exécutée dans le
répertoire de départ.
-execdir commande ;
-execdir commande {} +
Semblable à -exec, sauf que la commande indiquée sera exécutée à
partir du sous-répertoire contenant le fichier correspondant,
qui n’est normalement pas celui à partir duquel vous avez lancé
find. C’est une méthode bien plus fiable d’invocation de
commande, puisqu’elle évite des conflits de résolution de
chemins des fichiers trouvés. Comme pour l’option -exec, la
forme de -execdir avec « + » construira une ligne de commande de
telle sorte qu’elle pourra traiter plusieurs fichiers trouvés en
une passe (avec une restriction, chaque invocation de commande
ne portera que sur une liste de fichiers issue d’un seul et même
répertoire). Si vous utilisez cette option, veillez bien à ce
que votre variable d’environnement $PATH ne contienne pas une
référence au répertoire courant « . », sinon un pirate pourrait
lancer toutes les commandes qu’il souhaite en mettant un fichier
au nom adéquat dans les répertoires où vous allez lancer un
-execdir. De la même manière, évitez les références vides ou les
noms de répertoires exprimés en relatif dans $PATH.
-fls fichier
Vrai ; semblable à -ls, mais écrire dans le fichier comme le
fait -fprint. Le fichier en sortie est toujours créé, même si le
prédicat n’est jamais vérifié. Consultez la section NOMS DE
FICHIERS PEU COURANTS pour obtenir des informations sur la
gestion des caractères inhabituels dans les noms de fichier.
-fprint fichier
Vrai ; écrire le nom complet dans le fichier. Si fichier
n’existe pas au démarrage de find, il est créé. S’il existe, il
est écrasé. Les noms de fichier « /dev/stdout » et
« /dev/stderr » sont traités de manière particulière, ils
correspondent respectivement à la sortie standard et à la sortie
d’erreurs. Le fichier de sortie est toujours crée, même si le
prédicat n’est jamais vérifié. Consultez la section NOMS DE
FICHIERS PEU COURANTS pour obtenir des informations sur la
gestion des caractères inhabituels dans les noms de fichiers.
-fprint0 fichier
Vrai ; semblable à -print0 mais écrire dans le fichier comme le
fait -fprint. Le fichier de sortie est toujours créé, même si le
prédicat n’est jamais vérifié. Consultez la section NOMS DE
FICHIERS PEU COURANTS pour obtenir des informations sur la
gestion des caractères inhabituels dans les noms de fichiers.
-fprintf fichier format
Vrai ; semblable à -printf mais écrire dans le fichier comme le
fait -fprint. Le fichier de sortie est toujours créé, même si le
prédicat n’est jamais vérifié. Consultez la section NOMS DE
FICHIERS PEU COURANTS pour obtenir des informations sur la
gestion des caractères inhabituels dans les noms de fichiers.
-ls Vrai, afficher le nom du fichier en cours dans le format ls
-dils sur la sortie standard. La taille est calculée en blocs de
1 Ko, à moins que la variable d’environnement POSIXLY_CORRECT ne
soit positionnée, auquel cas la taille est calculée en blocs de
512 octets. Consultez la section NOMS DE FICHIERS PEU COURANTS
pour obtenir des informations sur la gestion des caractères
inhabituels dans les noms de fichier.
-ok commande ;
Comme -exec mais interroger d’abord l’utilisateur. Si
l’utilisateur aquiesce, la commande est lancée. Sinon, le test
devient faux. Si la commande est lancée, son entrée standard est
redirigée depuis /dev/null.
La réponse à la question posée est comparée à deux expressions
rationnelles afin de déterminer s’il s’agit d’une réponse
positive ou négative. Ces expressions rationnelles sont données
par le système si la variable d’environnement ‘POSIXLY_CORRECT’
est définie, et dans le cas contraire, dans les traductions des
messages de find. Si le système n’a aucune définition
appropriée, les propres définitions de find seront utilisées.
Dans tous les cas, l’interprétation de ces expressions
rationnelles sera modifiée par les variables d’environnement
’LC_CTYPE’ (classe de caractères) et ’LC_COLLATE’ (caractères
étendues et équivalencede classes).
-okdir commande ;
Comme -execdir mais interroge d’abord l’utilisateur comme dans
le cas de -ok. Si l’utilisateur n’acquiesce pas, le test
devient faux. Si la commande est lancée, son entrée standard est
redirigée depuis /dev/null.
-print Vrai ; afficher le nom complet du fichier sur la sortie
standard, suivi d’un saut de ligne. Si vous redirigez la sortie
standard de find vers un autre programme et qu’il y a la moindre
chance qu’un des noms des fichiers que vous recherchez contienne
un saut de ligne, alors vous devriez très sérieusement opter
pour l’option -print0 plutôt que -print. Consultez la section
NOMS DE FICHIERS PEU COURANTS pour obtenir des informations sur
la gestion des caractères inhabituels dans les noms de fichier.
-print0
Vrai ; afficher le nom complet du fichier sur la sortie
standard, suivi d’un caractère nul (à la place du caractère saut
de ligne que -print utilise). Ceci permet aux fichiers dont le
nom contient un saut de ligne ou d’autres types de caractères
non affichables, d’être correctement interprétés par les
programmes utilisant les données en sortie de find. Cette option
correspond à l’option -0 de xargs.
-printf format
Vrai ; afficher le format indiqué sur la sortie standard, en
interprétant les séquences d’échappement « \ » et les directives
« %». La largeur et la précision des champs peuvent être
spécifiés comme dans la fonction « printf » du langage C. Notez
bien que la plupart des champs sont affichés selon %s plutôt que
%d, ce qui veut dire que les drapeaux ne fonctionneront
peut-être pas comme vous vous y attendiez. Cela veut aussi dire
que le drapeau « - » fonctionnera (il force l’alignement des
champs à gauche). Contrairement à -print, -printf n’ajoute pas
de saut de ligne à la fin de la chaîne. Les séquences
d’échappement et les directives sont les suivantes :
\a Sonnerie.
\b Effacement arrière (Backspace).
\c Arrêter immédiatement l’impression du format et vider le
flux de sortie.
\f Saut de page.
\n Saut de ligne.
\r Retour chariot.
\t Tabulation horizontale.
\v Tabulation verticale.
\0 Caractère ASCII NUL.
\\ Un caractère « \ » littéral.
\NNN Le caractère ASCII dont le code est NNN (en octal).
Un « \ » suivi de n’importe quel autre caractère est traité
comme un caractère ordinaire ; ils sont donc affichés tous les
deux.
%% Un caractère pourcentage littéral (%).
%a Date du dernier accès au fichier, dans le format renvoyé
par la fonction C ctime(3).
%Ak Date du dernier accès au fichier, dans le format spécifié
par k, qui doit être soit un « @ », soit une directive
pour la fonction C « strftime». Les valeurs possibles de
k sont indiquées ci-dessous, certaines d’entre-elles ne
sont pas disponibles sur tous les systèmes, à cause des
différences entre les fonctions « strftime » existantes.
@ Secondes écoulées depuis le 1er janvier 1970 à
00 h 00 GMT, avec une partie décimale.
Champs horaires :
H Heure (00..23)
I Heure (01..12)
k Heure (0..23)
l Heure (1..12)
M Minute (00..59)
p AM ou PM, avec la désignation locale
r Heure au format 12 heures (hh:mm:ss [AP]M)
S Seconde (00.00 .. 61.00). Accepte une partie
décimale.
T Heure au format 24 heures (hh:mm:ss)
+ La date et l’heure, séparées par un « + »,
« 2004-04-28+22:22:05 » par exemple. Ceci est une
extension GNU. L’heure est donnée dans la zone
horaire courante (qui peut être modifiée via la
variable d’environnement TZ). Le second champ
contient une partie décimale.
X Représentation locale de l’heure (H:M:S)
Z Fuseau horaire (par exemple MET), ou rien si le
fuseau horaire est indéterminé.
Champs de date :
a Abréviation locale du jour de la semaine
(lun..dim)
A Nom local entier du jour de la semaine, de
longueur variable (lundi..dimanche)
b Abréviation locale du mois (jan..déc)
B Nom local entier du mois, de longueur variable
(janvier..décembre)
c Date et heure locale (Sat Nov 04 12:02:33 EST
1989). Le format utilisé est le même que pour
ctime(3), et, afin de préserver la compatibilité
avec ce format, il n’y a pas de partie décimale
pour les secondes.
d Quantième du mois (01..31)
D Date (mm/jj/aa)
h Identique à b
j Jour de l’année (001..366)
m Mois (01..12)
U Numéro de la semaine dans l’année, les semaines
commençant le dimanche (00..53)
w Jour de la semaine (0..6)
W Numéro de la semaine dans l’année, les semaines
commençant le lundi (00..53)
x Représentation locale de la date (mm/jj/aa)
y Les deux derniers chiffres de l’année (00..99)
Y Année (1970...)
%b Taille de l’espace disque consommé par le fichier, en
nombre de blocs de 512 octets. Puisque l’espace disque
est alloué par multiple de la taille d’un bloc du système
de fichiers, on obtient souvent un résultat supérieur à
%s/512. Il peut aussi être inférieur si le fichier est
creux (sparse file).
%c Date de dernière modification du statut du fichier, dans
le format renvoyé par la fonction C « ctime ».
%Ck Date de dernière modification du statut du fichier, dans
le format spécifié par k, comme pour la directive %A.
%d Profondeur du fichier dans l’arborescence des
répertoires, 0 signifiant que le fichier est un paramètre
de la ligne de commande.
%D Le numéro du périphérique sur lequel le fichier est rangé
(la valeur du champ st_dev field de la structure stat)
exprimé en décimal.
%f Nom du fichier, sans aucun nom de répertoire (dernier
élément uniquement).
%F Type de système de fichiers sur lequel se trouve le
fichier. Cette valeur peut être utilisée pour l’option
-fstype.
%g Nom du groupe propriétaire du fichier, ou identifiant de
groupe numérique si le groupe n’a pas de nom.
%G Identifiant de groupe numérique du fichier.
%h Répertoires en tête du nom de fichier (tout sauf la
dernière partie). Si le nom du fichier ne contient aucune
barre oblique (NDT : slash) (donc si c’est un fichier du
répertoire courant), alors l’option %h rajoutera « .».
%H Paramètre de la ligne de commande à partir duquel le
fichier a été trouvé.
%i Numéro d’inode du fichier (en décimal).
%k Taille du fichier, en nombre de blocs de 1 kilo-octet.
Puisque l’espace disque est alloué par multiple de la
taille d’un bloc du système de fichiers, on obtient
souvent un résultat supérieur à %s/1024. Il peut aussi
être inférieur si le fichier est éparpillé.
%l Destination du lien symbolique (vide si le fichier n’est
pas un lien symbolique).
%m Bits d’autorisation d’accès au fichier (en octal). Cette
option utilise les nombres « traditionnellement »
utilisés dans la plupart des implémentations d’Unix, mais
si votre système utilise un ordre inhabituel de la forme
octale des bits de permissions, alors vous observerez une
différence entre la valeur réelle des modes du fichiers
et la sortie de %m. On veut habituellement un zéro en
début de ce nombre, et pour l’obtenir, vous pouvez
utiliser le drapeau # (« %#m », par exemple).
%M Les permissions du fichier (sous forme symbolique, comme
dans ls). Cette directive n’est disponible que dans les
versions de findutils 4.2.5 et suivantes.
%n Nombre de liens physiques sur le fichier.
%p Nom du fichier.
%P Nom du fichier, en retirant le nom du paramètre de ligne
de commande à partir duquel le fichier a été trouvé.
%s Taille du fichier en octets.
%S Densité du fichier, calculée par la formule
(TAILLEBLOC*nb_bloc/taille_fichier). La valeur obtenue
pour un fichier régulier d’une certaine taille dépend du
système d’exploitation. Toutefois, la valeur normalement
attendue pour un fichier creux (sparse file) est
inférieure à 1.0, tandis qu’un fichier qui utilise
l’indirection de blocs pourra obtenir une valeur
supérieure à 1.0. La valeur de TAILLEBLOC est dépendante
du système, mais est souvent de 512 octets. Si le fichier
a une taille nulle, la valeur affichée est indéfinie. Sur
les systèmes qui n’offre pas la gestion des nombres de
blocs, la valeur de la densité du fichier sera de 1.0.
%t Date de dernière modification du fichier, dans le format
renvoyé par la fonction C « ctime ».
%Tk Date de dernière modification du fichier, dans le format
spécifié par k, comme pour la directive %A.
%u Nom du propriétaire du fichier, ou identifiant
utilisateur numérique si l’utilisateur n’a pas de nom.
%U Identifiant utilisateur numérique du propriétaire du
fichier.
%y Type du fichier (comme dans ls -l), U pour type inconnu
(ce qui ne devrait pas arriver).
%Y Type du fichier (comme pour %y), suivi, pour les liens
symbolique, de : L=boucle, N=inexistant.
Un caractère « % » suivi de n’importe quel autre caractère est
supprimé, mais le second caractère est affiché (ne soyez pas
trop confiant cependant, car de nouveaux caractères de format
pourront être un jour utilisés). Un «% » à la fin de l’argument
de format peut engendrer un comportement aléatoire puisqu’il n’y
a aucun caractère suivant. Ce qui peut être plus ou moins grave
suivant les cas.
Les options %m et %d gèrent les drapeaux #, 0 et +, à l’inverse
des autres directives, même si elles affichent des nombres. Les
autres directives numériques qui ne gèrent pas ces drapeaux sont
G, U, b, D, k et n. Le drapeau de format « - » est géré, et
transforme l’alignement des champs (qui sont par défaut alignés
à droite) en alignement à gauche.
Consultez la section NOMS DE FICHIERS PEU COURANTS pour obtenir
des informations sur la gestion des caractères inhabituels dans
les noms de fichier.
-prune Vrai ; Si le fichier est un répertoire, ne pas le parcourir. Si
l’option -depth est utilisée : faux, aucun effet. Puisque
-delete entraîne -depth, vous ne pouvez pas utiliser
conjointement -prune et -delete.
-quit Arrêter immédiatement. Tous les processus fils seront arrêtés,
et plus aucun des chemins indiqués sur la ligne de commande ne
sera traité. find /tmp/toto /tmp/titi -print -quit n’affichera
que /tmp/toto, par exemple. Toute ligne de commande construite
par -execdir ... {} + sera exécutée avant l’arrêt de find. La
valeur de retour sera ou ne sera pas zéro, selon qu’une erreur
ait eu lieu précédemment ou non.
NOMS DE FICHIERS PEU COURANTS
Beaucoup d’actions de find finissent par afficher des données qui sont
sous le contrôle d’autres utilisateurs. Cela est vrai pour les noms de
fichiers, les tailles, les dates de modification et ainsi de suite. Les
noms de fichiers posent des problèmes potentiels puisqu’ils peuvent
contenir n’importe quel caractère, à l’exception de « \0 » et « / ».
Les caractères inhabituels dans les noms de fichier peuvent produire
des résultats inattendus et souvent indésirables sur votre terminal
(modifier les définitions des touches de fonctions de certains
terminaux, par exemple). Les caractères inhabituels sont gérés de
différentes façons selon les actions, selon la description ci-dessous.
-print0, -fprint0
Affiche toujours exactement le nom de fichier non modifié, même
si la sortie est un terminal.
-ls, -fls
Tout caractère inhabituel est toujours protégé. Les espaces, les
barres obliques inverses et les guillemets sont affichés selon
les conventions des échappements du C (« \f »,« \" », par
exemple). Tous les autres caractères inhabituels sont affichés
en octal. Tous les autres caractères affichables (en ce qui
concerne -ls et -fls, il s’agit des caractères dont le code
octal est compris entre 041 et 0176) sont affichés en l’état.
-printf, -fprintf
Si la sortie n’est pas un terminal, les caractères sont affichés
en l’état. Sinon, le résultat dépend de la directive en cours
d’utilisation. Les directives %D, %F, %g, %G, %H, %Y et %y sont
transformées en valeurs non contrôlées par les propriétaires des
fichiers, et donc imprimées telles quelles. Les directives %a,
%b, %c, %d, %i, %k, %m, %M, %n, %s, %t, %u et %U donnent des
valeurs qui sont sous le contrôle des propriétaires des
fichiers, mais qui ne peuvent pas être utilisées pour envoyer
des données arbitraires au terminal, elles sont donc imprimées
telles quelles. Les directives %f, %h, %l, %p et %P sont
protégées par des guillemets. Cette protection est appliquée à
la manière du ls du GNU. Il ne s’agit pas du même mécanisme de
protection que celui utilisé pour -ls et -fls. Si vous pouvez
choisir le format à utiliser pour la sortie de find, sachez
qu’il vaut mieux utiliser « \0 » plutôt que nouvelle ligne en
tant que terminaison, car les noms de fichiers peuvent contenir
des caractères espaces ou nouvelle ligne. Le réglage de la
variable d’environnement ‘LC_CTYPE’ permet de définir la liste
des caractères qui doivent être protégés.
-print, -fprint
Les guillemets sont gérés à la manière de -printf et -fprintf.
Si vous utilisez find dans un script ou dans un cas de figure
particulier dans lesquels les fichiers correspondants peuvent
avoir des noms arbitraires, l’utilisation de -print0 devrait
être préférée à -print.
Les actions -ok et -okdir affichent le nom du fichier traité tel qu’il
est. Cela pourrait changer dans une version ultérieure.
OPÉRATEURS
Dans l’ordre de priorité décroissante :
( expr )
Forcer la précédence. Comme les parenthèses risquent d’être
interprétées par le shell, vous devriez normalement les
protéger. De nombreux exemples de cette page de manuel utilise
l’antislash dans ce but, par exemple « \(...\) » au lieu de
« (...) ».
! expr Vrai si expr est faux. Ce caractère doit habituellement être
protégé pour éviter d’être interprété par le shell.
-not expr
Identique à ! expr, mais non conforme à la norme POSIX.
expr1 expr2
Deux expressions sur la même ligne sont implicitement reliées
par un ET ; expr2 n’est pas évaluée si expr1 est fausse.
expr1 -a expr2
Identique à expr1 expr2.
expr1 -and expr2
Identique à expr1 expr2, mais non conforme à la norme POSIX.
expr1 -o expr2
OU ; expr2 n’est pas évaluée si expr1 est vraie.
expr1 -or expr2
Identique à expr1 -o expr2, mais non conforme à la norme POSIX.
expr1 , expr2
Lister ; expr1 et expr2 sont toujours évaluées. La valeur de
expr1 est annulée, la valeur de la liste est la valeur de expr2.
Le séparateur virgule est pratique pour rechercher différents
types de choses tout en ne traversant qu’une fois l’arborescence
du système de fichiers. L’action -fprintf peut être utilisée
pour récupérer une liste d’éléments variés pour les ranger dans
différents fichiers en sortie.
CONFORMITÉ AUX STANDARDS
Définissez la variable d’environnement POSIXLY_CORRECT pour une
compatibilité au plus proche du standard POSIX. Les options suivantes
sont définies dans le standard POSIX (IEEE Std 1003.1, Édition 2003) :
-H Cette option est gérée.
-L Cette option est gérée.
-name Cette option est gérée, mais la conformité à POSIX dépend de la
conformité POSIX de la fonction fnmatch(3) de la bibliothèque du
système. À l’heure de findutils-4.2.2, les métacaractères du
shell (« * », « ? » ou « []» par exemple) trouveront les
fichiers commençant par « . » (l’interprétation d’IEEE PASC 126
l’impose). Ceci diffère des versions précédentes de findutils.
-type Gérée. POSIX définit « b », « c », « d », « l », « p », « f » et
« s ». Le find du GNU gère aussi « D », ce qui représente une
Porte, pour les systèmes d’exploitation qui en fournissent.
-ok Gérée. L’interprétation de la réponse est soumise aux schémas
(’patterns’) choisis grâce au réglage de la variable
d’environnement ‘LC_MESSAGES’. Lorsque la variable
d’environnement ‘POSIXLY_CORRECT’ est définie, ces schémas sont
obtenus à partir de la définition des réponses positives (yes)
et négatives (no) du système. Consultez la documentation
nl_langinfo(3) du système, et notamment YESEXPR et NOEXPR.
Lorsque ‘POSIXLY_CORRECT’ n’est pas défini, ces schémas sont
extraits du propre catalogue de messages de find.
-newer Gérée. Si le fichier spécifié est un lien symbolique, il est
toujours déréférencé. Ceci est différent du comportement
précédent, qui prenait en compte les valeurs de temps du lien
symbolique (consultez la section HISTORIQUE plus loin).
-perm Gérée. Si la variable d’environnement POSIXLY_CORRECT n’est pas
définie, quelques arguments de mode d’accès (par exemple +a+x),
bien que non valables en POSIX, sont gérés par souci de
compatibilité.
Autres prédicats
Les prédicats -atime, -ctime, -depth, -group, -links, -mtime,
-nogroup, -nouser, -perm, -print, -prune, -size, -user et -xdev
sont tous gérés.
Le standard POSIX définit les parenthèses « ( », « ) », la négation
«! » et les opérateurs « and » et « or » (-a, -o).
Toutes les autres options, prédicats, expressions et ainsi de suite
sont des extensions hors du standard POSIX. Beaucoup de ces extensions
ne sont de toutes façons pas l’apanage du find du GNU.
Le standard POSIX impose que find détecte les boucles.
L’utilitaire find doit détecter les boucles infinies, telles que
le retour dans un répertoire déjà visité, alors qu’on revient du
dernier fichier rencontré. Quand il détecte une boucle infinie,
find doit afficher un message de diagnostic sur la sortie
d’erreur, et essayer de revenir à sa position d’origine ou
s’arrêter.
La commande find du GNU est conforme à cette exigence. Le décompte des
liens dans un répertoire qui contient des liens en dur vers des
répertoires supérieurs sera souvent inférieur à celui attendu. Cela
peut être dû au fait que le find du GNU optimise l’accès en évitant de
parcourir un sous-répertoire qui s’avère être un lien vers un
répertoire supérieur. Bien que find ne parcourt pas le répertoire dans
ce cas précis, il permet aussi d’éviter l’émission d’un message
d’avertissement. Cette façon de faire peut sembler génératrice
d’erreurs, mais il est peu probable que quiconque puisse réellement en
être gêné. Si l’optimisation du parcours des feuilles (NDT : leaf) a
été désactivée avec -noleaf, cette entrée du répertoire sera bel et
bien parcourue, et le message d’avertissement émis si nécessaire. Les
liens symboliques ne peuvent pas servir à créer de telles boucles dans
le système de fichiers, par contre, si les options -L ou -follow sont
actives, alors un message d’avertissement sera émis quand find
rencontrera une boucle de liens symboliques. Comme pour les boucles
contenant des liens en dur, l’optimisation de parcours des feuilles
(NDT : leaf) signifie souvent que find sait qu’il n’a pas à appliquer
stat() ou chdir() sur le lien symbolique, et donc que ce diagnostic est
souvent inutile.
L’option -d est gérée pour des raisons de compatibilité avec divers
systèmes BSD, mais préférez plutôt l’utilisation de l’option -depth
conforme POSIX.
Le positionnement de la variable d’environnement POSIXLY_CORRECT ne
modifie pas le comportement des tests -regex or -iregex parce que ces
tests ne sont pas définis dans le standard POSIX.
VARIABLES D’ENVIRONNEMENT
LANG Fournit une valeur par défaut pour les variables de localisation
qui ne sont pas définies ou nulles.
LC_ALL Si elle contient une chaîne de caractères non vide, remplace les
valeurs de toutes les autres variables de localisation.
LC_COLLATE
The POSIX standard specifies that this variable affects the
pattern matching to be used for the -name option. GNU find uses
the fnmatch(3) library function, and so support for ‘LC_COLLATE’
depends on the system library. This variable also affects the
interpretation of the response to -ok; while the ‘LC_MESSAGES’
variable selects the actual pattern used to interpret the
response to -ok, the interpretation of any bracket expressions
in the pattern will be affected by ‘LC_COLLATE’.
LC_CTYPE
Cette variable contrôle le traitement des classes de caractères
utilisées dans les expressions rationnelles ainsi que dans le
test -name, si la fonction fnmatch(3) fournie par la
bibiiothèque le gère. Cette variable altère aussi
l’interprétatiion de toute classe de caractères des expressions
rationnelles utilisées pour analyser la réponse donnée aux
questions posées par -ok. La variable d’environnement
‘LC_CTYPE’ modifie aussi la liste des caractères dit
non-imprimables lors de l’affichage des noms de fichiers.
Consultez la section ’NOMS DE FICHIERS INHABITUELS’.
LC_MESSAGES
Définit la locale à utiliser pour les messages
internationnalisés. Lorsque la variable d’environnement
‘POSIXLY_CORRECT’ est définie, cela détermine aussi
l’interprétation des réponses fournies aux questions posées par
l’action -ok.
NLSPATH
Détermine l’endroit où sont rangés les catalogues de messages
localisés.
PATH Détermine les répertoires dans lesquels find cherchera les
exécutables invoqués par -exec, -execdir, -ok et -okdir.
POSIXLY_CORRECT
Détermine la taille des blocs utilisés par -ls et -fls. Si
POSIXLY_CORRECT est défini, les blocs sont des unités de 512
octets. Sinon, il s’agit d’unités de 1024 octets.
Setting this variable also turns off warning messages (that is,
implies -nowarn) by default, because POSIX requires that apart
from the output for -ok, all messages printed on stderr are
diagnostics and must result in a non-zero exit status.
Lorsque POSIXLY_CORRECT n’est pas définie, -perm +zzz est géré
de la même façon que -perm /zzz, lorsque +zzz n’est pas un mode
symbolique valable. Lorsque POSIXLY_CORRECT est définie, une
telle demande est considérée comme une erreur.
Lorsque POSIXLY_CORRECT est défini, la réponse aux questions
posées par l’action -ok est analysée selon le catalogue des
messages du système, et non selon les propres messages du
catalogue de find.
TZ Modifie le fuseau horaire utilisé dans le format de certaines
directives liées au temps dans -printf et -fprintf.
EXEMPLES
find /tmp -name noyau -type f -print | xargs /bin/rm -f
Chercher les fichiers qui s’appellent noyau dans le répertoire /tmp et
ses sous-répertoires, puis les effacer. Rappelez-vous que vous pouvez
rencontrer des problèmes si des noms de fichiers comportent des retours
à la ligne, des guillemets simples ou doubles, ou des espaces.
find /tmp -name noyau -type f -print0 | xargs -0 /bin/rm -f
Chercher les fichiers qui s’appellent noyau dans le répertoire /tmp et
ses sous-répertoires, puis les effacer, en veillant à ce que les noms
de fichiers ou de répertoires qui contiennent des retours à la ligne,
des guillemets simples ou doubles ou des espaces soient correctement
traités. Le test -name est prioritaire sur le test -type afin d’éviter
l’appel de stat(2) pour chacun des fichiers.
find . -type f -exec file '{}' \;
Exécuter « file » sur chaque entrée du répertoire courant ou de ses
sous-répertoires. Attention à bien protéger les accolades par des
guillemets simples afin d’empêcher leur interprétation en tant que
ponctuation du script shell. De la même façon, le point-virgule est
protégé grâce à une barre oblique inverse, bien que l’apostrophe aurait
aussi pu être utilisée.
find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/grand.txt %-10s %p\n \)
Parcourir le système de fichiers en une seule passe, stockant les
fichiers et répertoires en setuid dans /root/suid.txt et les gros
fichiers dans /root/grand.txt.
find $HOME -mtime 0
Rechercher les fichiers de votre répertoire personnel qui ont été
modifiés lors des dernières vingt-quatre heures. Cette commande
s’exprime de cette façon parce que la recherche utilise le résultat de
la division entière par 24 de l’heure de dernière modification (la
fraction horaire est donc perdue). Ce qui veut dire que pour
correspondre à -mtime 0, un fichier doit avoir une antériorité de
modification inférieure à 24 heures.
find /sbin /usr/sbin -executable \! -readable -print
Rechercher les fichiers qui offrent le droit d’exécution, mais qui ne
sont pas lisibles.
find . -perm 664
Rechercher les fichiers qui ont la permission de lire et d’écrire pour
leur propriétaire et groupe, et que les autres utilisateurs ne peuvent
que lire. Les fichiers qui satisfont ces critères, mais qui ont
d’autres bits de permissions activés (par exemple si le fichier est
exécutable) ne seront pas sélectionnés.
find . -perm -664
Rechercher les fichiers qui ont la permission de lire et d’écrire pour
leur propriétaire et leur groupe, et que les autres utilisateurs
peuvent lire, sans toutefois s’intéresser à la présence d’autres bits
de permissions (le bit d’exécution par exemple). Un fichier ayant par
exemple les droits 0777 sera sélectionné.
find . -perm /222
Rechercher les fichiers qui offrent le droit d’écriture à quelqu’un
(son propriétaire, ou son groupe, ou bien encore n’importe qui).
find . -perm /220
find . -perm /u+w,g+w
find . -perm /u=w,g=w
Ces commandes font toutes les trois la même chose, mais la première
utilise le mode octal pour représenter les modes du fichier, alors que
les deux autres se servent de la forme symbolique. Ces commandes
recherchent tous les fichiers dans lesquels soit le propriétaire soit
le groupe peut écrire. Ces fichiers n’ont pas à offrir à la fois le
droit d’écriture au propriétaire et au groupe, l’un ou l’autre suffira.
find . -perm -220
find . -perm -g+w,u+w
Ces commandes font toutes deux la même chose, c’est-à-dire rechercher
les fichiers qui offrent le droit d’écriture au propriétaire ainsi
qu’au groupe.
find . -perm -444 -perm /222 ! -perm /111
find . -perm -a+r -perm /a+w ! -perm /a+x
Ces commandes recherchent toutes deux les fichiers qui sont lisibles
par tous (perm -444 ou -perm -a+r), ont au moins un des bits d’écriture
actif (-perm /222 ou -perm /a+w), mais qui ne sont exécutables par
personne (respectivement ! -perm /111 et ! -perm /a+x)
cd /source-dir
find . -name .snapshot -prune -o \( \! -name *~ -print0 \)|
cpio -pmd0 /dest-dir
Cette commande copie le contenu de /source-dir dans /dest-dir, sauf les
fichiers et répertoires s’appelant .snapshot (et tout ce qu’ils
contiennent). Elle ne copie pas non plus les fichiers ou répertoires
dont le nom finit par ~, mais copie par contre leur contenu. La
structure -prune -o \( ... -print0 \) est assez connue. L’idée ici,
c’est que l’expression avant -prune indique les fichiers à couper.
Toutefois, l’action -prune renvoie vrai, donc le -o qui suit n’applique
l’expression à sa droite que sur les répertoires qui n’ont pas été
coupés (le contenu des répertoires coupés n’est même pas consulté).
L’expression à droite du -o est entre parenthèses pour des raisons de
clarté uniquement. L’accent est mis ici sur le fait que l’action
-print0 ne s’exécute que pour les items qui n’ont pas été coupés par
-prune. Le «et » implicite entre les conditions de tests est plus
prioritaire que le -o, mais les parenthèses aident à comprendre ce
qu’il se passe ici.
find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \
-print -prune
Given the following directory of projects and their associated SCM
administrative directories, perform an efficient search for the
projects’ roots:
repo/project1/CVS
repo/gnu/project2/.svn
repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
Dans cet exemple, -prune évite l’inutile inspection des répertoires qui
ont déjà été découverts (ne cherche pas par exemple dans project3/src
puisqu’il a déjà été trouvé dans project3/.svn) tout en s’assurant que
les répertoires frères (project2 et project3) le sont.
VALEURS DE RETOUR
find s’arrête en renvoyant la valeur de retour 0 si tous les fichiers
ont été traités avec succès, ou en renvoyant une valeur supérieure à 0
si une erreur est survenue. Cette information est volontairement très
floue. Considérez simplement qu’en cas de valeur de retour différente
de zéro, vous ne devez pas vous fier à l’exactitude des résultats
fournis par find.
VOIR AUSSI
locate(1), locatedb(5), updatedb(1), xargs(1), chmod(1), fnmatch(3),
regex(7), stat(2), lstat(2), ls(1), printf(3), strftime(3), ctime(3),
Finding Files (en ligne dans Info, ou en version imprimée)
HISTORIQUE
À l’heure de findutils-4.2.2, les métacaractères du shell (« * », « ? »
ou « [] » par exemple) trouveront les fichiers commençant par « . »
parce que l’interprétation d’IEEE POSIX 126 l’impose.
-perm /MODE remplace la syntaxe -perm +MODE, qui est dépréciée depuis
findutils-4.2.21. -perm /000 correspond maintenant à tous les fichiers
plutôt qu’à aucun, comme dans findutils-4.3.3.
La gestion des nanosecondes dans les timestamps a été implémentée dans
findutils-4.3.3.
L’action -delete force find à envoyer un statut de sortie non nul en
cas d’échec, comme dans findutils-4.3.11. Toutefois, find ne
s’interrompra pas immédiatement. Dans les versions précédentes, le
statut de sortie de find n’était pas modifié par l’échec de -delete.
Fonctionnalités Ajoutées Offertes dans
-newerXY 4.3.3 BSD
-D 4.3.1
-O 4.3.1
-readable 4.3.0
-writable 4.3.0
-executable 4.3.0
-regextype 4.2.24
-exec ... + 4.2.12 POSIX
-execdir 4.2.12 BSD
-okdir 4.2.12
-samefile 4.2.11
-H 4.2.5 POSIX
-L 4.2.5 POSIX
-P 4.2.5 BSD
-delete 4.2.3
-quit 4.2.3
-d 4.2.3 BSD
-wholename 4.2.0
-iwholename 4.2.0
-ignore_readdir_race 4.2.0
-fls 4.0
-ilname 3.8
-iname 3.8
-ipath 3.8
-iregex 3.8
FAUX BOGUES
$ find . -name *.c -print
find : les chemins doivent précéder l’expression
Syntaxe : find [-H] [-L] [-P] [-Oniveau] [-D help|tree|search|stat|rates|opt|exec] [CHEMIN...] [EXPRESSION]
Cette erreur survient parce que *.c a été interprété par le shell, et
que la commande find a en fait reçu une ligne de commande qui
ressemblait à:
find . -name bigram.c code.c frcode.c locate.c -print
Cette commande ne peut bien sûr en aucun cas fonctionner. Plutôt que de
vous y prendre de cette façon, vous pourriez protéger votre motif de
recherche par des guillemets ou protéger les caractères jokers :
$ find . -name \*.c -print
BOGUES
Des problèmes de sécurité se posent, inhérent au comportement de find
tel que définit par le standard POSIX, et qui ne peuvent donc être
résolus. Par exemple, l’action -exec est dangereuse par nature, et
l’usage de -execdir est préférable. Consultez plutôt Finding Files pour
plus de détails.
La variable d’environnement LC_COLLATE n’a aucun effet sur l’action
-ok.
La meilleure façon de signaler un bogue est d’utiliser le formulaire en
ligne sur http://savannah.gnu.org/bugs/?group=findutils. L’intérêt de
cette méthode est que vous pourrez ensuite suivre l’évolution de la
résolution du problème. Tout autre commentaire concernant find(1) et le
paquet findutils en général peut être envoyé à la liste de diffusion
bug-findutils. Pour vous abonner à cette liste, envoyez un courriel à
bug-findutils-request@gnu.org.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess entre 1997 et 2003. La version présente dans Debian est
dorénavant maintenue par Sylvain Cherrier <sylvain DOT cherrier AT free
DOT fr> et les membres de la liste <debian-l10n-french AT lists DOT
debian DOT org>. Veuillez signaler toute erreur de traduction par un
rapport de bogue sur le paquet manpages-fr-extra.