La commande find (suite)

Suite à la publication de mon article sur la commande find, plusieurs personnes sont revenu vers moi afin de me demander d’autre options.

Voici donc 2 exemples d’options que j’utilise très souvent.

Trouver un fichier d’un autre utilisateur

J’avais déjà indiqué comment trouver un fichier d’un utilisateur dans l’article sur la commande find.
Ici, le but est de trouver un fichier n’appartenant pas à un user.

Prenons pour exemple le dossier home du user Christian.

find /home/christian ! -user christian -type f

Cette commande va me sortir tous les fichiers présents dans /home n’appartenant pas au user Christian.

De plus, en couplant cela avec un -exec, nous pouvons en tirer plus d’informations.

find /home/christian ! -user christian -type f -exec ls -lsa {} \;

Trouver un fichier ancien

Cette option est particulièrement intéressante dans le cas où vous auriez à gérer des logs et que vous manquez de place.

Dans le cas où je chercherais les fichiers ayant une date de modification de plus de 30 jours :

find /var/log/nginx -mtime +30

Il est à noter que, couplé avec d’autres options pour la taille, ou l’exécution, la commande devient, comme toujours, très puissante.

find /var/log/nginx -type f -mtime +30 -size +1G -exec rm {} \;

Ici, on cherche et supprime tous les fichiers de +30 jours de modification et ayant plus de 1 Go de taille.

La commande find

Il y a maintenant plusieurs années, j’avais écrit un article sur la commande grep intitulé recherche-rapide-dans-un-fichier-linux.
J’y expliquais la puissance de la commande permettant de trouver dans un fichier une expression souhaité.

Je me rends compte que je n’ai jamais parlé de la commande « Find » que j’utilise tout autant.

Au contraire de grep, find va me permettre de trouver un fichier ou un dossier en particulier.

Syntaxe de base

Comme toujours, je commence par un man de la commande afin de récupérer la syntaxe de base

find <path> -name=<string|regex>

À partir de là, l’utilisation basique de la commande peut se faire ainsi.

find /home/christian -name "maRecherce"

Trouver un fichier ou un dossier

Là où la commande devient plus intéressante, c’est que je peux décider de lui assigner un type recherché (fichier, dossier) avec l’option « type »

Par exemple, pour chercher un fichier

find /home/christian -type f -name "monFichier"

Et pour rechercher un dossier

find /home/christian -type d -name "mon dossier"

Trouver un fichier de plus de 1Go

Jusqu’ici, je peux trouver un dossier ou un fichier.
Néanmoins, j’aimerais avoir la liste des fichiers de plus de 1Go dans un dossier.
Pour cela, rien de plus simple, je vais utiliser l’option « size »

find /home/christian -type f -size 1G

Trouver un fichier d’un utilisateur

Il est aussi possible de chercher des fichiers d’un utilisateur avec l’option « user ».

find /temp -user Daniel

En plus de l’option « user », il est aussi possible d’utiliser l’option « uid »

find /temp -uid 1008

Exécuter une commande

Désormais, imaginons que j’aimerais exécuter une commande sur un fichier recherché. Et bien cela est tout à fait possible. Il suffit de suivre cette syntaxe.

find <path> -name <string|regex> -exec <command> {} \;

Les deux crochets ‘{}’ à la fin de la commande sont des caractères de remplacement. Ils seront remplacés par les fichiers et/ou les répertoires renvoyés par la commande find. Le signe ‘\;’ à la fin termine la commande find.

Considérons par exemple, que je souhaite copier tous les fichiers pdf de mon répertoire vers un autre. Voici la commande que je vais utiliser.

find /home/christian -name="*.pdf" -type f -exec cp {} /temp/pdf \;

Conclusion

La commande find est un outil extrêmement puissant.
Je n’ai pas présenté toutes les options, je vous encourage à regarder le man de la commande.

Nous pouvons bien sûr combiner plusieurs des options présentés pour rendre cela encore plus puissant.

Par exemple, si je souhaite copier tous les fichiers png, de 2 utilisateurs.
Les fichiers doivent faire plus de 10k et avoir un nom contenant « profil ».
Voici une proposition de commande:

find . '(' -user "daniel" -o -user "christian" ')' -type f -name "*profil*.png" -size 10k -exec cp {} /tmp/ \;