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