La commande find

La commande find permet de rechercher des fichiers au sein de l’arborescence du système de fichiers, à l’aide de critères et la possibilité d’agir sur les résultats retournés.

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
.
./fic1
./fic2
./fic3
./fic4
./rep1
./liste
./mypass
./users
./liste2
./ls.txt
./toto.tar.gz
./nohup.out
./liste_ls

Le chemin précisé étant relatif, l’affichage est relatif. Si le chemin précisé était l’absolu, l’affichage aurait été absolu.

Ses critères utiles

Les options permettent de définir les critères de recherche. Elles peuvent être combinées et groupées entre elles, sous forme et ET et de OU logiques.

-name, -iname

L’option -name permet une sélection par noms de fichiers. Il est possible d’utiliser les critères de recherches (caractères spéciaux) déjà vus. Le critère est idéalement placé en guillemets. Avec -iname , on n’effectue pas de différences entre les minuscules et les majuscules.

$ find . name "fic\*" -print
./fic1
./fic2
./fic3
./fic4

-type

L’option -type permet une sélection par type de fichier. Nous avons vu au début du cours qu’outre les exécutables, liens, répertoires et fichiers simples étaient présent d’autres types de fichiers.

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)
$ find . -name "re\*" -type d -print
./rep1
./rep2

-user et -group, -uid et -gid

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

-size

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

-empty

L’option -empty recherche des fichiers ou répertoires vides, c’est à dire de taille nulle.

-atime, -mtime et -ctime

  • -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)
  • -atimes +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

-newer

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

-perm

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

Ses commandes en option

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.

-ls

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

-exec

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

-ok

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

Critères AND / OR / NOT

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 (…).

Exemple avec tous les fichiers ne contenant pas fic dans leur nom, et tous les fichiers n’étant ni normaux ni des répertoires.

$ find . ! -name "\*fic\*" -print
.
./rep1
./liste
./mypass
./users
./liste2
./ls.txt
./toto.tar.gz
./nohup.out
./liste_ls
./rep2
./seb1
/seb2
$ find . ! \( -type f -o type d \) -ls
     409    0 lrwxrwxrwx  1 oracle   system          4 Aug 14 15:21 ./lien_fic1 -> fic1
     634    0 lrwxrwxrwx  1 oracle   system          4 Aug 14 15:21 ./lien_fic2 -> fic2