Cédric Temple

Administrateur système en logiciels libres

find, recherche de fichiers

2019-04-23 » notes pour plus tard

Ce contenu est fourni sous licence CC BY-NC-SA 4.0

Notes sur find

Ordre des paramètres

find <mondossier> <mesoptionsderecherche>
# exemple
find /home/cedric -type d

Trouver des types de fichiers

# dossier
find /home/cedric -type d
# fichier
find /home/cedric -type f
# pipe / fifo
find /home/cedric -type p
# lien symbolique
find /home/cedric -type l

Les éléments modifiés il y a plus de N…

# datas modifiées depuis plus de 3 jours
find /home/cedric -mtime +3
# datas modifiées depuis plus de 30 minutes
find /home/cedric -mmin +30
# datas modifiées depuis moins de 3 jours
find /home/cedric -mtime -3
# datas modifiées depuis moins de 30 minutes
find /home/cedric -mmin -30

Gestion de la profondeur de recherche

Find permet de ne pas rechercher dans toute la profondeur de l’arborescence, il peut ne parcourir que le niveau souhaité :

# n'afficher que les fichiers et dossiers dans ce dossier, ne pas afficher les sous-dossiers :
find /home/cedric -maxdepth 1
# n'afficher que les fichiers et dossiers que dans ce dossier et le sous-dossier de ceux-ci :
find /home/cedric -maxdepth 2
# n'afficher que les dossiers du répertoire courant :
find /home/cedric -maxdepth 1 -type d

Rechercher un nom

Il y a beaucoup d’options pour faire des recherches avec find. Je ne liste que les cas que j’utilise régulièrement ici. En cas de besoin, regarder la page de man.

# trouver un élément dont le nom commence par 'tmp.' 
find /tmp/ -name 'tmp.*'
# trouver un élément dont le nom commence par un premier caractère, n'importe lequel, suivi de mp suivi d'un point suivi de n'importe quoi
find /tmp/ -name '?mp.*'

Rechercher élément appartenant à un owner ou à un groupe

# trouver tous les dossiers appartenant à root :
find /home/cedric -type d -user root
find /home/cedric -type d -user 0
find /home/cedric -type d -uid 0
# ATTENTION : ceci NE marche PAS (uid attend un paramètre numérique pas le nom de l'utilisateur)
find /home/cedric -type d -uid root

# trouver tous les dossiers appartenant au groupe root :
find /home/cedric -type d -group root
find /home/cedric -type d -group 0
find /home/cedric -type d -guid 0
# ATTENTION : ceci NE marche PAS (guid attend un paramètre numérique pas le nom de l'utilisateur)
find /home/cedric -type d -guid root

Exécuter une commande sur les éléments trouvés

Il est possible de faire exécuter une commande par find sur les éléments trouvés. Pour identifier l’élément trouvé par find et qui sera passé en argument, on utilise {}. Pour indiquer que l’on veut exécuter la commande à chaque fois qu’un élément est trouvé, on utilise \; et pour éviter d’appeler à chaque fois la commande mais de grouper les commandes, on utilise +

# format général :
find <mondossier> <mesoptionsderecherche> -exec <macommande> {} \;
# ou alors
find <mondossier> <mesoptionsderecherche> -exec <macommande> {} +
# comme c'est complexe, on prend un exemple
# ici, on prend l'exemple de la commande "echo" pour bien se rendre compte de la différence entre les 2 commandes
# exécuter la commande chaque fois qu'un élément est trouvé, en passant l'élément sur la ligne de commande :
find /tmp/ -ctime +3 -name '?mp.*' -type d -exec echo {} \;
/tmp/tmp.VGdpVjbcNN
/tmp/tmp.YiCMCAYqKI
/tmp/tmp.7qlNxdFImr
/tmp/tmp.emQHqrJazM
/tmp/tmp.QMTqiYjnOv
/tmp/tmp.TsSgE9PcEZ
/tmp/tmp.yzygVbpP61
# exécuter la commande une seule fois mais en passant tous les éléments sur la ligne de commande :
find /tmp/ -ctime +3 -name '?mp.*' -type d -exec echo {} +
/tmp/tmp.VGdpVjbcNN /tmp/tmp.YiCMCAYqKI /tmp/tmp.7qlNxdFImr /tmp/tmp.emQHqrJazM /tmp/tmp.QMTqiYjnOv /tmp/tmp.TsSgE9PcEZ /tmp/tmp.yzygVbpP61

Selon le cas pratique, il peut être mieux de faire l’une ou l’autre des commandes. Dans le cas où on veut effacer des fichiers par exemple, les performances sont bien meilleures avec le + plutôt qu’avec \; :

time find . -name 'toto*' -type f -exec rm -f {} \;
real    1m14.729s
user    0m43.944s
sys     0m31.813s

time find . -name 'toto*' -type f -exec rm -f {} +
real    0m0.126s
user    0m0.046s
sys     0m0.034s

Dans le premier cas, la commande réalise des milliers de fork(), dans l’autre seulement six ! La performance est alors bien bien meilleure.

Ce contenu est fourni sous licence CC BY-NC-SA 4.0