Recherche de fichiers

Ce chapitre explique comment trouver des fichiers sur un système Linux selon différents critères comme la taille, les dates, les propriétaires ou encore les permissions. La recherche de fichiers peut se réaliser avec les commandes find et xargs, locate, which et whereis.

1. Recherche de fichier avec find

La page Manuel de find et xargs regorgent d’exemples à lire que je ne vais pas reproduire ici.

man find
man xargs

Voici la syntaxede la commande find :

find <REPERTOIRE> <CRITERE> [-exec <COMMANDE> {} \;]

Le paramètre REPERTOIRE indique à find l’emplacement de démarrage de la recherche et CRITERE peut être, parmi beaucoup d’autres, le nom du fichier ou du répertoire que nous recherchons.

1.1. Exemples de recherche

find /usr/share/doc -name "x*"
find / -user 1000
find / -user 1000 2> /dev/null

Les lignes correspondantes sont listées sur la sortie standard.

L’option -ls offre une sortie plus lisible :

find / -user 1000 -ls

On peut également lancer une commande sur cette sortie, comme supprimer le fichier ou changer le mode de permission, en utilisant l’option -exec de find. Par exemple, pour copier tous les fichiers appartenant à l’utilisateur 2015, à condition d’en avoir les droits :

find / -type f -user 2015 –exec cp -a {} ~/backup \;

Dans ce dernier exemple,

  • \; à la fin de la ligne termine la commande -exec
  • et {} remplace chaque ligne trouvée par la commande find.

1.2. Recherche avec find et xargs

On voit souvent en xargs le compagnon de find. En fait, xargs traite chaque ligne de la sortie standard comme paramètre pour une autre commande. On pourrait utiliser aussi xargs pour supprimer tous les fichiers appartenant à un utilisateur avec cette ligne de commande :

find / -type f -user 2015 | xargs cp -a -t ~/backup

Remarque : Certaines commandes comme rm ne savent pas traiter les paramètres trop longs. Il est parfois nécessaire de supprimer tous les fichiers d’un répertoire avec :

ls labs | xargs rm -f

1.3. Options courantes de find

Exemples d’options courantes :

find /home/francois -name "fichier*"
find labs -iname fichier1.txt
find labs -name "x*" -exec rm {} \;

2. Exercice de recherche de fichiers

Trouver des fichiers SUID/SGID. Ici de la page manuel :

find / \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \
       \( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)
cat /root/suid.txt
cat /root/big.txt

Trouver tous les fichiers SUID root :

find / -user root -perm -4000

Trouver tous les fichiers SGID root :

find / -group root -perm -2000

Trouver tous les fichiers SUID et SGID appartenant à n’importe qui :

find / -perm -4000 -o -perm -2000

Trouver tous les fichiers qui n’appartiennent à aucun utilisateur :

find / -nouser

Trouver tous les fichiers qui n’appartiennent à aucun groupe :

find / -nogroup

Trouver tous les liens symboliques et leurs cibles.

find / -type l -ls

Effacer les fichiers de plus de 5 jours :


find /path/to/directory/ -mindepth 1 -mtime +5 -delete

Note : https://linuxboxadmin.com/micro-howtos/system-administration/find-suid/sgid-files.html

3. Recherche de fichiers avec locate

Syntaxe :

locate <CHAINE>

Le programme locate liste tous les fichiers et répertoires qui correspondent à l’expression.

locate fichier1

La recherche avec locate est très rapide. En fait, locate interroge la base de données /var/lib/?locate/?locate.db. Cette base de données est tenue à jour par une tâche quotidienne cron (cronjob) qui lance updatedb.

Le fichier /etc/updatedb.conf est lu par updatedb lorsqu’il est lancé manuellement pour déterminer les systèmes de fichiers et les répertoires dont il ne doit pas tenir compte (montages NFS et /tmp par exemple).

On peut lancer une mise à jour manuelle de l’index de la base de donnée :

su
updatedb
exit
locate fichier1

4. Recherche de fichiers avec which

Syntaxe :

which chaîne

which retourne le chemin complet de la commande dont le nom est chaîne en parcourant les répertoires définis dans la variable PATH de l’utilisateur uniquement.

5. Recherche de fichiers avec whereis

Syntaxe :

whereis chaîne

Cette commande affiche le chemin absolu des sources, binaires des pages manuel pour les fichiers correspondant à chaîne en se basant sur le PATH ainsi que sur des répertoires couramment utilisés.