Les possibilités de la commande find

Cet article va vous décrire les principales fonctionnalités de la commande find. Cette dernière, comme son nom l’indique, effectue une recherche. Plus exactement de la recherche de ressources dans le système de fichiers (dossier, fichier, lien). La commande permet de faire certaines actions sur les éléments retournés. Cet article n’a pas vocation à être exhaustif, mais à présenter un panel représentatif des options les plus utilisées.

Effectuer une recherche avec la commande find

Vous pouvez faire des recherches selon plusieurs critères:

  • Le nom
  • Le type de la ressource (fichier, dossier, lien …)
  • La taille
  • Les permission
  • La date de modification, de création ou d’accès

Chaque critère est une option de la commande.Voici comment doit être utilisée la commande find :

   find SEARCH_PATH SEARCH_OPTION

Avec :

  • SEARCH_PATH le chemin du dossier où la recherche à lieu
  • SEARCH_OPTION l’ensemble des options de recherche.

Les principales options

La commande find permet de rechercher en fonction du type de ressource. Ainsi dans l’exemple suivant le resultat est l’ensemble des fichiers (« f ») du répertoire courant:

   find . -type f

Cette option donne également la possibilité de rechercher les dossiers (« d ») ou les liens symboliques (« l »). A noter que la recherche est récursive par défaut, et ira donc chercher dans les sous dossiers.

Un second critère permet de chercher en fonction du nom de la ressource. La commande ci-dessous recherche l’ensemble des ressources dont le nom est .htaccess dans le répertoire /var/www/:

    find /var/www -name ".htaccess"

L’option -name accepte des patterns. Par exemple, « *.java » récupérera l’ensemble des fichiers terminant par l’extension « .java ».

Il est également possible de rechercher en fonction de la taille. Ainsi la commande suivante permet de rechercher l’ensemble des ressources de plus de 1Go dans le répertoire /home/user.

    find /home/user/ -size +1G

Cette option permet de rechercher les ressources inférieurs à une taille. Par exemple, l’option « -size -100M » permet de trouver les ressources inférieurs à 100Mo.

Un autre critère de recherche possible sont les permissions des ressources. La ligne suivante permet de rechercher les ressources sur lesquelles le propriétaire a les droits en lecture et écriture (6), et les autres utilisateurs ont les droits en lecture (4).

    find . -perm 644

Ce filtre permet également de rechercher les ressources disponibles en écriture sur l’ensemble des 3 types d’utilisateurs avec mettant la valeur « /222 » à l’option. Il est aussi possible d’utiliser la représentation symbolique des droits:

   find . -perm -u+rw,g+r,o+r

La commande find possède une option permettant de filtrer sur la date de création/modification/accès des ressources. Voici trois exemples permettant de récupérer respectivement les ressources créés il y a plus de 30 jours, celles modifiées il y a moins d’une semaine et celles auxquelles un utilisateur a accédé ces deux derniers jours :

   find -ctime +30
    find -mtime -7
    find -atime -2

Ils existent des options similaires pour définir le temps en minutes ce sont les options : cmin, mmin et amin.

La commande find permet d’utiliser plusieurs options ensemble. Par exemple pour récupérer tous les fichiers de log de tomcat de plus de 100Mo:

   find /opt/tomcat/log -name "*.log" -size +100M

Autre exemple de l’utilisation des options multiples, il est possible de récupérer les fichiers entre 1Mo et 100Mo.

   find -size +1M -size -100M

Une option intéressante permet de supprimer le résultat de la recherche avec l’option -delete. En reprenant l’exemple précédent, cela permet de trouver les fichiers de logs volumineux et de les supprimer:

   find /opt/tomcat/log -name "*.log" -size +100M -delete

Ecrire le résultat dans un fichier

Dans certain cas (post-traitement par exemple), il est nécessaire de sauvegarder le résultat d’une recherche, le moyen le plus simple est de rediriger la sortie de la commande vers un fichier.

    find ./ -type f > ./my_result.txt

De manière générale le « > » après une commande, permet d’exporter le resultat et de l’écrire dans un fichier, en écrasant le contenu de ce dernier s’il existe.

Il existe aussi les options printf et fprintf qui permettent d’écrire dans un fichier, ces options permettent d’ajouter dans le fichier les informations souhaitées relatives aux résultats.

   find ./ -type f -printf ./result.txt "%p\ %s\\n"

La commande précédente recherche dans le dossier courant l’ensemble des fichiers et écrit le résultat de la recherche dans result.txt en respectant le pattern %p\ %s\n pour chaque résultat. Ce pattern correspond au nom du fichier (« %p ») suivi d’un espace (« / « ) puis de la taille du fichier (« %s ») pour finir avec un saut de ligne (« \n »).

Voici une liste d’autres données qu’il est possible d’écrire:

  • Les permissions
  • La profondeur de la ressource dans votre arborescence
  • Le nom du groupe et du propriétaire du fichier

Plus d’informations sur l’option printf.

Exécuter une commande sur le résultat

Il existe deux façons de faire pour exécuter une commande sur les résultats d’un find. La première est l’utilisation de la commande xargs.

Pour rappel, la commande xargs permet de lancer une commande avec plusieurs arguments par exemple :

    xargs echo
    Linux
    Certif

Cela équivaut à faire :

    echo Linux Certif

Voici un exemple de la commande find avec xargs, cette commande permet de récupérer tous les fichiers avec l’extention .log et d’afficher leurs informations.

   find -type f -name "*.log" | xargs ls -l

Attention: Si la commande find retourne trop de résultats, il est possible qu’une erreur survienne. Dans ce cas, il est nécessaire de modifier la commande de la manière suivante:

   find -type f -name "*.log" -print0 | xargs -0 ls -l

La seconde manière d’exécuter une commande est d’utiliser l’option -exec de find. Pour obtenir le même résultat que la commande précédente voici la commande:

   find -type f -name "*.log" -exec ls -l {} \;

Pour aller plus loin

Il est possible d’associer plusieurs critères de recherche en les combinant avec les opérateurs booléens. Avec -a pour et, -o pour ou, ! pour négation. Par exemple :

    find . \( -name "*.log" -o -name "*.txt" \)

La commande précédente permet de trouver, dans le répertoire courant, les fichiers qui finissent par l’extension .log ou .txt. Autre exemple:

   find /opt/tomcat/logs \( -name "*.log" -a ! -name "catalina*" \)

Cette fois-ci, dans les logs tomcats nous allons chercher les fichiers qui finissent par « .log » et qui ne commence pas par « catalina ».

Il existe de nombreuses autres possibilités qui correspondront peut être à d’autres de vos besoins. Je vous invite à consulter les sources qui disposent de plus di’nformations et des exemples complémentaires.

 

Merci Amaury et Mathieu pour vos relectures !

Sources:


Partager l'article :

Facebooktwittergoogle_plusredditlinkedinmail
 

Vous aussi participez, laissez un commentaire