La commande find permet de rechercher des fichiers correspondants à un ou plusieurs critères et de réaliser des actions sur ces fichiers.

syntaxe générale de la commande find

La syntaxe générale de la commande est de la forme :

    find <répertoire> <critère> <action>

avec :

  • répertoire : le nom du répertoire ou doit commencer la rechercher (. pour le répertoire courant, \ pour la racine du système …)
  • critère : le ou les critères de recherche. Celui ci peut cocerner le nom ou l’extension du fichier, les dates d’accès du fichier, le type de fichier ….
  • action : ce qui doit être réalisé sur le ou les fichiers répondants aux critères. La plus simple des actions étant d’afficher le nom du fichier lors d’une recherche

La commande find est puissante, soyez prudents dans le choix des commandes à exécuter !
Exemple à ne pas reproduire : find / -name "*" -exec rm {} \; : recherche à partir de la racine (/) tous les fichiers (*) et les efface (rm) !

Pour des informations détaillées, il faut se reporter à l’aide fournie par la commande man find

Quelques examples

Forcer les droits pour tout un ensemble de fichiers :

  • Change toutes les directories en drwxr-xr-x
    find . -type d -exec chmod 755 {} \; 
  • Change tous les fichiers en -rw-r–r–
    find . -type f -exec chmod 644 {} \; 

Chercher un pattern dans toute une arborescence, en affichant le nom des fichiers trouvés :

     find . -name '*toto*' -ls;

Exécuter un script sur les fichiers trouvés :

find . -name '\*toto\*' -exec \$HOME/taille.sh {} \\;

Dans ce cas, le script taille.sh situé dans le répertoire personnel sera exécuté sur chaque fichier contenant la chaine toto dans son nom.
Si le script taille.sh contient :

    #!/bin/bash 
    taille=`du -ks $1 | cut -f1 -d" "`
    date=`ls -lisa $1 | cut -f8 -d" "`
    pptaire=`ls -lisa $1 | cut -f5 -d" "`
    echo "$1;$pptaire;$date;$taille"

alors vous obtiendrez en sortie le nom du fichier, son propriétaire, sa date d’enregistrement et sa taille au format csv.

Un autre exemple trouvé sur opensource.jegalere.fr qui permet de lister tous les fichiers d’un répertoire et de ses sous-répertoires, puis de remplacer une chaine par une autre. Il est également possible de rajouter des critères de recherche pour ne traiter que quelques fichiers particulier.

    find /mon/rép -exec sed -i "s/chaine_cherchée/chaine_remplacée/g" {} \;

Rajout de commandes le 20/03/2008

Rechercher des fichiers en prenant comme critères plusieurs extensions possible ainsi qu’un critère de modification :

    find . \( -name "*.xls" -o -name "*.doc" -o -name "*.BAK" -o -name "*.bak" -o -name "*.txt" \) -mtime +20 -exec ls -lisa {} \;

Pour rediriger le résultat de la commande find, il est possible d’utiliser la commande tee

    find . -name "*.pl" -type f -mtime +20 -exec ls -lisa {} \; | tee $HOME/temp/liste_perl.txt

Pour lister tous les fichiers ne répondant pas à une condition :

     find . ! -name "*.pl" -type f -mtime +20 -exec ls -lisa {} \;

Rajout du 29/10/09

Pour effacer les fichiers deplus de 30 jours (utile pour un dossier de sauvegarde des dump Mysql) :

    find $HOME/save_mysql -mtime +30 -exec rm {} \;