find et fd

Après bat, voici un nouvel outil en Rust permettant de remplacer le vénérable find. L’objectif n’est pas cette fois-ci d’avoir de jolies couleurs et un truc tout shiny, mais plutôt de simplifier la syntaxe … et j’avoue que c’est pas du luxe !

Comme je suis loin d’utiliser find sur une base quotidienne, ce ne serait pas très honnête de promouvoir fd sans d’abord refaire un petit tour de find et de sa syntaxe. On va donc faire cet article en deux chapitres : l’un sur find, l’autre sur fd.

1. find

La syntaxe est basique :

find <chemin> <conditions> <action>

Conditions

-name "*.c"

-user rancune
-nouser

-type f         # Fichier ( File )
-type d         # Repertoire ( Directory )
-type l         # Lien symbolique ( Link )

-depth 2        # Descende d'au moins 3 niveau en profondeur
-regex PATTERN

-size 8         # 8 blocks ( de 512 Octets )
-size -128c     # Plus petit que 128 Octets
-size 144k      # Exactement 144 KiB
-size +10M      # Plus grand que 10 MiB
-size +2G       # Plus grand que 2 GiB

-newer fichier.txt
-newerm fichier.txt     # Modifié plus recemment que fichier.txt
-newerX fichier.txt     # [c]changé, [m] modifié ou [B] crée
-newerXt "1 hour ago"   # basé sur le timestamp

\! -name "*.c"          # not logique
\( x -or y \)           # ou logique

Actions

-exec rm {} \;          # Exemple pour effacer
-print
-delete

Exemples

find . -name '*.jpg'
find . -name '*.c' -exec rm {} \;

find . -newerBt "24 hours ago"

find . -type f -mtimes +29      # Recherche des fichiers modifiés il y a plus de 30 jours  

find . -iname devel.c           # Insensible à la casse

2. fd

Syntaxe

   fd [-HIEsiaLp0hV] [-d depth] [-t filetype] [-e
   ext] [-E exclude] [-c when] [-j num] [-x  cmd]
   [pattern] [path...]

Recherche simple et rapide:

fd devel.c              # Recherche de devel.c dans tout le filesystem
fd '^x.*rc$'            # Recherche basée sur expression régulière

fd passwd /etc          # Recherche à partir d'un repertoire

fd -e md                # Recherche par extension

fd -g libc.so /usr      # Recherche d'un pattern précis 

fd -e zip -x unzip      # execute une commande sur chaque fichier 
fd -e zip -X unzip      # execute une commande sur la liste des fichiers

Ça, c’est beau !

Le mot de la fin …

On ne va pas se mentir, fd est quand même assez attrayant. Pourtant, je trouve la logique de find assez élégante, même si un peu old-school. Je pense que chez moi, fd va trouver sa place, mais à côté de find … pas en tant que remplaçant !

Rancune