La commande find
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 {} \;