
find repertoires critères options La commande find étant récursive, il suffit d'indiquer un répertoire de base pour que toute l'arborescence depuis ce répertoire soit développée. L'option de base est -print (souvent implicite sur la plupart des Unix) qui permet d'afficher sur écran les résultats. $ find . -print .
|
| Code fichier | Type de fichier |
| b | Fichier spécial en mode bloc |
| c | Fichier spécial en mode caractère |
| d | R épertoire (directory) |
| f | fichier normal |
| l | lien symbolique |
| p | tube nommé (pipe) |
| s | Socket (sur certains Unix) |
Les options -user et -group permettent une recherche sur le propriétaire et le groupe d'appartenance des fichiers. Il est possible de préciser le nom (utilisateur, groupe) ou l'ID (UID, GID). On peut aussi préciser -uid et -gid avec les numéros UID et GID.
$ find . -type f -user oracle -group dba -print
./fic1
./fic3
L'option -size permet de préciser la taille des fichiers recherchés.
|
* -size 5 : recherche les fichiers d'une taille de 5 blocs (512 octets par bloc, soit ici 2560 octets) * -size 152c : recherche les fichiers d'une taille de 152 caractères (octets) * -size 10k : recherche les fichiers d'une taille de 10ko (10*1024 octets = 10240 octets) * -size +/- valeur[c/k] : si ? alors recherche des fichiers ayant une taille inférieure à celle indiquée, si + alors recherche des fichiers ayant une taille supérieure à celle indiquée. $ find /tmp -type f -size +100k -print /tmp/quota.user /tmp/seb/ls.txt /tmp/seb/liste_ls /tmp/messages /tmp/oracledml_715.log /tmp/oracledml_716.log /tmp/dml2_ae_ajout_RM_FS_AS_BM_MSE_Juillet2002.lst /tmp/oracledml_714.log /tmp/dml4_ae_compta_RM_FS_AS_BM_MSE_Juillet2002.lst /tmp/Corrections_avant_valo_juillet_2002.lst /tmp/DML_40.lst |
L'option -empty recherche des fichiers ou répertoires vides, c'est à dire de taille nulle.
Liste les fichiers de longueur nulle grace à la commande
$ find . -empty -exec ls {} \;
Après avoir trouvé des fichiers vides, vous pourriez souhaiter les supprimer en remplacant la commande ls par rm.
* -atime : recherche sur la date du dernier accès (access time)
* -mtime : recherche sur la date de dernière modification (modification time)
* -ctime : recherche sur la dare de création (creation time, en fait la date de dernière modification du numéro d'inode)
Ces trois options ne travaillent qu'avec des jours (périodes de 24 heures). 0 est le jour même, 1 24 heures, 2 48 heures, ...
|
Les signes + ou ? permettent de préciser les termes « de plus » et « de moins » : * -mtime 1 : fichiers modifiés hier (entre 24 et 48 heures) * -mtime -3 : fichiers modifiés il y a moins de trois jours (72 heures) * -atime +4 : fichiers modifiés il y a plus de 4 jours (plus de 96 heures) $ find /tmp -type f -size +100k -ctime +5 -print /tmp/quota.user /tmp/oracledml_714.log /tmp/Corrections_avant_valo_juillet_2002.lst |
L'option -newer permet de rechercher des fichiers plus récemment modifiés que celui indiqué. Par exemple rechercher un fichier plus récent que toto.txt :
$ find . -newer toto.txt -print
L'option -perm permet d'effectuer des recherches sur les autorisations d'accès (droits, SUID, SGID, Sticky). Les droits doivent être précisés en base 8 (valeur octale) et complets. Le caractère « - » placé devant la valeur octale signifie que les fichiers recherchés doivent au moins avoir les droits désirés. Ex pour rw-rw-rw- (666).
$ find /tmp -perm 666 -print
-rw-rw-rw- 1 root system 9650 Aug 14 11:15 /tmp/LOG/load_logi.log
L'option -links permet une recherche par nombre de hard links. On peut aussi préciser les signes + ou ? (plus de n liens et moins de n liens). Un fichier normal seul possède 1 lien. Un répertoire 2 liens (L'entrée dans le catalogue dont il fait partie et dans .). Pour une recherche de liens symboliques il faudra utiliser l'option -type l.
$ find . -type f -links +2 -print
./fic2
./hardlink3_fic2
./hardlink_fic2
./hardlink2_fic2
L'option -inum permet une recherche par numéro d'inode. Elle est utile dans le cas d'une recherche de tous les liens portant un même numéro d'inode. Le numéro d'inode est visible par l'option -i de la commande ls.
$ ls -i
95 fic1 643 hardlink_fic2 36 liste_ls 205 seb1
643 fic2 219 lien2_symbol_fic1 705 ls.txt 284 seb2
707 fic3 95 lien_fic1 237 mypass 110 toto.tar.gz
546 fic4 14 lien_symbol_fic1 886 nohup.out 212 users
643 hardlink2_fic2 266 liste 916 rep1
643 hardlink3_fic2 1006 liste2 881 rep2
$ find . -inum 95 -print
./fic1
./lien_fic1
Outre l'option -print on trouve deux autres options permettant d'effectuer une action sur les fichiers trouvés. Pour l'option -printf permettant un format précis de la sortie, on se reportera au man pages.
Copie du contenu d'un répertoire
La commande find vous permet de copier le contenu entier d'un répertoire tout en préservant les permissions, les propriétaires de chaque fichier et sous-répertoire. Il suffit de combiner find avec la commande cpio comme cecis:
$ cd /path/to/source/dir
$ find . | cpio -pdumv /path/to/destination/dir
La commande cpio est une commande servant à copier des fichiers à l'intèrieur ou en dehors d'une archive cpio ou tar, en préservant automatiquement les permissions et les propriétaires de chaque fichier et sous-répertoire
L'option -ls affiche des informations détaillées sur les fichiers trouvés correspondant au critère au lieu du simple nom de fichier.
$ find . -inum 95 -ls -print
95 0 -rwxr-xr-x 2 oracle dba 0 Aug 12 11:05 ./fic1 ./fic1
95 0 -rwxr-xr-x 2 oracle dba 0 Aug 12 11:05 ./lien_fic1 ./lien_fic1
L
'option -exec va exécuter la commande située juste après pour chaque occurrence trouvée. Quelques remarques :
1. -exec doit obligatoirement être la dernière option de la commande find.
2. La commande exécutée par -exec doit se terminer par un « ; ». Ce caractère spécial doit s'écrire \; pour ne pas être interprété par le shell.
3. Pour passer comme paramètre à la commande le fichier trouvé par find, il faut écrire {} (substitution du fichier).
Exemple pour effacer tous les liens symboliques du répertoire courant (avec le détail des fichiers supprimés) :
$ find . -type l -ls -exec rm -f {} \;
14 0 lrwxrwxrwx 1 oracle system 4 Aug 14 14:48 ./lien_symbol_fic1 -> fic1
219 0 lrwxrwxrwx 1 oracle system 4 Aug 14 14:48 ./lien2_symbol_fic1 -> fic1
find . -name *.gif -exec ls {} \;
Le paramètre -exec a un réel pouvoir. Quand un fichier est trouvé qui correspond aux critères de recherche, le paramètre -exec définit ce qu'il faut faire de ce fichier. Par exemple:
1. Recherche depuis le répertoire courant et en dessous, en utilisant le point (.) juste après find.
2. Repère tous les fichiers dont le nom finit par .gif (images).
3. Liste tous les fichiers trouvés, grâce a la commande ls.
Contenir des fichiers LOG et TMP
Pour contenir des fichiers LOG et TMP file en cas d'applications générant beaucoup de ce genre de fichiers, on peut placer les commandes suivants dans une tache cron à lancer quotidiennement:
$ find $LOGDIR -type d -mtime +0 -exec compress -r {} \;
$ find $LOGDIR -type d -mtime +5 -exec rm -f {} \;
La première commande s'exécute dans tous les répertoires (-type d) trouvés dans la variable $LOGDIR dans laquelle les données d'un fichier ont été modifiées depuis les dernières 24 (-mtime +0) et les compresse (compress -r {}) pour économiser de l'espace disque. La seconde commande efface les fichiers (rm -f {}) s'ils sont plus anciens qu'une semaine de travail (-mtime +5), pour augmenter l'espace disque.
L'option -ok est identique à l'option -exec sauf que pour chaque occurrence, une confirmation est demandée à l'utilisateur.
$ find . -inum 95 -ok rm -f {} \;
rm ... ./fic1 > (yes)? n
rm ... ./lien_fic1 > (yes)? y
Il est possible de combiner les options de critère de sélection. Sans aucune précision c'est le ET logique qui est implicite.
| Critère | Action |
| -a | AND, ET logique |
| -o | OR, OU logique |
| ! | NOT, NON logique |
| (...) | groupement des combinaisons. Les parenthèses doivent être vérouillées \(...\). |