La commande find pour les nuls

11 août 2015 nakama

Développement

(Cet article a été écrit il y a très longtemps, dans une galaxie très très lointaine)

Avant tout : le terminal c’est quoi ? C’est un outil très pratique qui peut vous permettre de réaliser plusieurs actions « simplement » quand on le maitrise un peu.

Et oui le terminal c’est ce magnifique écran noir avec des lignes blanches ( comme dans les films :p )

screen-terminal

Ce qu’on va faire c’est une simple recherche de fichiers

  • avec extension(s)
  • avec un mot-clé

Pourquoi utiliser cet outil alors qu’on pourrait le faire avec une interface graphique ? ( l’explorateur de win, le finder de mac, etc. ) Tout simplement, car cela est plus rapide et il est possible d’utiliser des REGEX afin de récupérer ce que l’on souhaite.

Imaginons qu’on voudrait récupérer toutes les images d’un dossier ( et des sous dossiers qu’il contient ). Allez dans le dossier en question et copier coller cette commande.

On pourrait traduire cette commande part : là où je suis ( symbolisé par le point ) , trouve moi tous les fichiers ( -type f ) qui ont une extension .jpg ou .png ou .jpeg.

find . \( -name '*.jpg' -o -name '*.png' -o -name '*.jpeg' \) -type f

Vous allez tomber sur ce genre d’affichage :

screen-resultats1

On remarque que la commande récupère bien des images .png et .jpg et passe bien dans chaque dossier.

Si vous vous voulez sélectionner les images contenant un certain mot, ce n’est pas bien plus difficile :

find . -name '*copie*' -type f

Grâce a cette commande, tous les fichiers contenant le mot « copie » sera sélectionné.

screen-resultats2

Mais ce n’est pas encore parfait, car cette commande récupère tout fichier contenant le mot « copie » mais dans notre cas on voudrait uniquement les images ( .png pour l’exemple )

find . \( -name '*.png' -name '*copie*' \) -type f

Rien de plus simple, il faut uniquement modifier la commande en précisant qu’on recherche uniquement les images .png. On remarque l’absence du mot-clé -o qui signifie l’un ou l’autre ( OR )

screen-resultats3

On va continuer avec la recherche d’un nom de fichier bien précis. Par exemple le fichier .DS_Store de Mac

find . -name '.DS_Store' -type f

screen-resultats4

On constate que la commande a trouvé plusieurs fichiers dans plusieurs dossiers.

Le dossier node_modules étant un dossier généré automatiquement avec l’aide de Grunt ou Gulp, j’aimerais pouvoir l’exclure de notre recherche.

find . \( -name '.DS_Store' -o -name 'node_modules' -prune \) -type f

L’option -prune permet d’exclure des éléments, ici le dossier node_modules.

 

On terminera avec l’option la plus dangereuse : -delete qui vous permet de supprimer les éléments que votre recherche va trouver.

Si on retourne a notre exemple des images .png avec le mot-clé « copie », si on souhaite les supprimer :

find . \( -name '*.png' -name '*copie*' \) -type f -delete

ATTENTION : les fichiers supprimés seront définitivement supprimé ! Ils ne seront pas dans votre corbeille. Donc l’option est à utiliser uniquement si vous êtes sûr de vous.

Pour en savoir plus sur la commande find.

Le bonus du jour 🙂 la commande grep

Elle sert a recherche un mot dans un fichier et d’afficher les lignes ou le terme a été trouvé.

Cette commande est très pratique pour du debug.

Imaginons que dans votre application vous avez besoin d’avoir un suivi bien précis de chaque étape de votre développement. Malheureusement vos logs et ceux de php sont dans le même fichier et parcourir environ 1 242 898 lignes …. cela peut très vite faire peur et vous décourager. Heureusement, avec cette commande on va pouvoir récupérer uniquement nos logs et en faire un nouveau fichier.

Pour que cela se passe le plus facilement possible, prenez l’habitude de toujours préfixé vos logs par une chaine de caractères qui sera toujours identique afin que cela devienne notre élément de recherche. Pour l’exemple, mon préfixe sera : « ##DEBUG »

Voici un exemple de fichier dans lequel se trouve nos logs.

screen-resultats5

Et oui un fichier de logs c’est ça.

Pour retrouver tous nos débugs cela peut s’avérer compliquer et long. Mais une fois que vous utilisez un préfixe tout devient plus simple et plus rapide et le tout grâce a cette commande : on va récupérer UNIQUEMENT les lignes commencent par ##DEBUG suivi de n’importe quel caractère ( cf le lien des REGEX vu plus haut )

// affichera le résultat dans le terminal
grep "##DEBUG.*" debug.log

// créera un fichier log.txt avec le résultat
grep "##DEBUG.*" debug.log > log.txt

Pour en savoir plus, voici un lien qui détail d’autres possibilités.

Mots-clés associés à cet article :

Retrouvez d'autres articles par catégories