Vous êtes ici

Trucs de geek : la commande find

Quand vous cherchez des fichiers sur votre station n'ayez pas peur de passer par la console et la ligne de commande. En effet la commande find offre un ensemble d'option qui va améliorer la qualité de vos recherches. Elle nécessite un peu de pratique et devient vite indispensable.

La commande find est à la base toute simple : on chercher quelque chose quelque part.

$ find . *

va chercher à partir du dossier courant tous les fichiers et va parcourir les sous répertoires.

On a tout intérêt à affiner sa recherche. On peut par exemple préciser si l'on chercher des fichiers ou de répertoires.

$ find . * -type d

n'affichez que les dossiers alors que

$ find . * -type f

n'affichera que des fichiers.

On peut affiner la recherche en ajoutant des critères sur le noms des fichiers recherchés :

$ find . -name "java" -type f

ne recherche que des fichiers contenant java dans leur nom.

$ find . -name "*java" -type f

ne recherche que des fichiers terminant par java. Pour éviter les soucis de case utilisez plutot l'option "iname".

Si vous ne souhaitez pas réaliser une recherche récursive sur l'ensemble de votre arborescence, vous pouvez limiter le nombre de sous réperoire :

$ find . -maxdepth 2 -type f -name "*.sh"

Dans ce cas, la recherche se fera dans le dossier en cours et dans les sous dosiers immédiat. Pour limiter au seul répertoire, il suffit d'indiquer "-maxdepth 1".

Avec find on peut rechercher des fichiers sur leur taille. Il suffit de savoir que la taille s'exprime en blocs de 512 octets. Donc ,

$ find . -maxdepth 1 -type f -size 1 -name "*.sh" -exec ls -l {} \;

vous affiche les fichiers de moins de 512 octets qui sont des scripts bash et qui sont dans le dossier courant.

Au passage on remarque qu'avec "exec" il faut impérativement termner la commande par "{} \;" qui siginifie "nom du fichier trouvé" et "fin de l'exec" que l'on protège avec une anti slash pour éviter que le bash ne l'interprête.

On peut préciser quand on veut travailler en Méga octets :

$ find -size 50M

cherche bien les fichiers de plus de 50 Mo.

On peut rechercher les fichiers dont la taille est comprise entre deux valeurs. Ainsi

$ find -size +50M -size -100M

cherche les fichiers entre 50 et 100 Mo.

On peut rechercher les fichiers en fonction de leurs droits. Ainsi la commande suivante :

$ find . -type f -perm 0644 -print

cherche les fichiers non exécutable lisible et modifiable par son propriétaire en seulment lisible par les autres utlisateurs y compris ceux appartenant au groupe du propriétaire.

Il est possible d'utiliser la négation. Ainsi la commande suivante :

$ find . -type f ! -perm 0777 -print

cherche les fichiers non exécutables dans le dossier courant.

Autre exemple : vous cherchez des fichiers (-type f) mais vous ne voulez pas traiter les fichiers cachés (! -name ".*"). Et voila !

Il est possible de rechercher les fichiers en fonction de leur date de création ("-ctime"), de modification ("-mtime") ou de dernier accés ("-atime"). L'évaluation retourne les fichiers qui ont un durée inférieure en nombre de jours quand on indique une date négative. Ainsi :

$ find . -maxdepth 1 -type f -ctime -1 -name "*.sh" -exec ls -l {} \;

liste les scripts du dossier courant dont la date de création est inférieure à 1 jour.

On peut donc lister les fichiers dont la date de création est de moins de 60 minutes ou dont la date de création est dans les 50 derniers jours ou entre les 100 et 50 derniers jours.

$ find -mtime 50 : fichiers modifiés il y a 50 jours

$ find -atime 50 : fichiers accédés il y a 50 jours

$ find . -mtime +50 -mtime -100 : fichiers modifiés entre 50 et 100 jours

$ find -cmin -60 : fichiers créés au cours de la dernière heure

$ find -mmin -60 : fichiers modifiés au cours de la dernière heure

$ find -amin -60 : fichiers accédés au cours de la dernière heure

Naturellement tous les critères ce dessus peuvent être utlisés ensemble. Ainsi :

$ find / -type f -name *.mp3 -size +10M

vous liste les fichiers mp3 de plus de 10 Mo.

FIND + XARGS : La commande xagrs est souvent utilisée à la suite de la recherche de fichiers afin de réaliser un traitement sur les fichiers ou répertoires trouvés. On peut rencontrer des soucis avec les noms qui comportent des espaces. Pour les traiter tout de même il faut ajouter cetaines options au find et au xargs :

$ find . -name "*log*" -print0 | xargs -0 ls -l

Ainsi le find met en forme les résultats trouvés et xargs ssait les interprêter de la bonne manière.

Autre moyen pour exécuter un traitement sur la liste des fichiers trouvés :

$ find . -maxdepth 1 -type f -name "*.sh" -exec ls -l {} \;

Cette commande effectue donc un "ls" pour chacun des scrips bash trouvés.

Cette commande peut vous permettre de supprimer les fichiers vides du dossier courant :

$ find . -type f -empty -exec rm -f {} \;

On peut afficher une liste des fichiers d'un dossier en les triant par taille :

$ find . -type f -exec stat -c "%15s %n" {} \;|sort -n

ou

$ find . -type f -exec stat -c "%15s %n" {} \;|sort -rn

ou

$ find . -type f -printf "%-14s %P\n" | sort -n

Petit truc avec find : vous pouvez effectuer des recherches sur plusieurs noms de fichiers. Imaginons que vous souhaitiez trouvez les fichiers textes et les scripts SH, vous allez passer cette commande :

$ find . -type f \( -name "*.sh" -o -name "*.txt" \)

Attention à bien protéger les parenthéses.

Fait le 08/01/2016

Tags: 

Utilisateurs en ligne

Il y a actuellement 0 utilisateur connecté.

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer