Fdz - outil de recherche dérivé de find

« Quand on cherche, on trouve », mais pas toujours exactement ce qu’on voudrait.
Telle pourrait être la devise de ce sujet.

Find est l’outil le plus commun et accessible même à très bas niveau à partir d’un binaire busybox statique de 600 Ko (pas celui de Debian), pas besoin de libc6 et autre quincaillerie, et find est donc incontournable en tant qu’outil de recherche de fichiers, en mode dépannage et plus.

Seulement voilà… find peut difficilement être correctement exploité sans se plonger dans les méandres de sa doc, comprendre ses gémissements de ‹ prédicats ›, et se soumettre à son intransigeance ordonnée implacable.

Dans un script, find est parfait, mais en mode courant dans un terminal, find est très vite fatigant avec la longueur et rigueur impérative de sa syntaxe, et on se retrouve très vite avec des milliers de lignes inexploitables explosant inutilement la mémoire du terminal, si on ne filtre pas correctement initialement la demande.

En résumé, find n’est pas un outil ‹ sympa ›, pas ‹ user-friendly ›, ni convivial, et ce n’est pas son objectif. Il existe bien sûr d’autres outils de recherche, tels que fzf ou fd (fd-find chez Debian), et bien d’autres, et j’ai utilisé fd un moment, mais très superficiellement uniquement, en évitant de trop m’y habituer.

Alors pourquoi chercher autre chose, et … revenir vers find ?
Parce-que fd, par exemple, certes dont la syntaxe est plus sympa que find, inverse certaines fonctions de find, répertoire après le texte recherché, est en regex par défaut, alors que find est en globbing (*) par défault, et fd a aussi sa propre logique qu’il faut apprendre, et jongler de l’outil de recherche X à Y à Z devient vite casse-tête, d’autant plus que le globbing est ce qu’il y a de moins universel d’un shell à l’autre, selon les obscurs paramétrages (built-in). Savoir si ‹ .* › est du regex ou du globbing, ça ne se devine pas au doigt mouillé selon le contexte.

C’est ainsi que fdz est né, comme un besoin, un outil sur mesure.
C’est simplement une surcouche bash sur find, pour flexibiliser l’utilisation de find, et rendre son utilisation sympa, avec quelques sécurités par défaut, et un peu de couleur pour améliorer la lisibilité en mode terminal, et insensible à l’ordre des arguments.

Comment ça marche ? Tout est intégré dans fdz --help.

`fdz --help`

fdz permet une recherche plus simple et utilisable au quotiden que ‹ find ›.
fdz traite -x|-exec , avec message d’information avant exécution commande,
mais la sortie peut aussi être redirigée/traitée si nécessaire :
« fdz .... | xargs <cmd> », en optant pour l’option sans couleur (-nc) pour éviter
de potentiels problèmes selon envirionnement terminal.
La connaissance de find est un préalable recommandé pour mieux comprendre la suite.

Par défaut:
• Les fichiers cachés sont exclus, et accessibles avec l’option -a ou -all
La recherche est indifférente aux minuscules/majuscules (voir -ni pour inverser)

• avec paramètres, et si l’option -maxpedth de find, soit -x pour fdz, n’est pas
renseignée, le niveau de recherche se limitera à 10 sous-répertoires
→ ajustable avec l’option -x ; exemple: -12
et le répertoire de recherche de référence est le niveau 1 ( -mindepth )
Le niveau 1 est relatif au répertoire fourni à fdz, et non le répertoire courant.
→ ajustable avec l’option +y ; exemple: +2

• fdz demande de poursuivre ou non si plus de $MX éléments sont trouvés;
→ sécurité désactivable avec l’option -nl,-nolimit pour tout voir.

• fdz affiche une synthèse du nombre d’éléments trouvés
→ désactivable avec l’option -noinfo

• fdz ne fouille pas dans les poubelles (Trash / lost+found)

• fdz est insensible à l’ordre des paramètres saisis en usage courant de recherche,
sauf en cas d’utilisation de -x|-exec et de -s|-size, l’ordre des arguments
étant inévitablement important.

• fdz ne traverse pas les systèmes de fichiers différents (-xdev), ni les liens ;

• fdz met un peu de couleur, pour y voir plus clair dans les résultats.

Important:
• les dossiers de recherche peuvent être multiples

• le texte recherché peut être un nom strict (exemple dvb_core), ou utiliser le glob
( *, [xyz] ), et non pas le regex, en recommandant très vivement de quoter la chaîne
recherchée pour éviter les surprises selon le shell et ses multiples options de globbing:
*dvb*core* : OK / *dvb*core* : non

• le type dossier/fichier/lien recherché peut être précisé comme suit:
-d pour dossier, -f pour fichier, -l pour lien, -d,f pour dossier+fichier etc
la valeur par défaut étant -d,f,l

• le texte recherché peut être soit un nom de fichier/dossier (-n,-name),
ou une recherche dans le chemin de répertoire (-p,-path): name+path par défaut

• ce ‹ help › est accessible avec l’option --help (2 tirets).

:black_medium_small_square: Synthèse des commandes: fdz -h

  usage simple: fdz /rep/ '*text*[xyz]*'

  si /rep/ est vide, recherche dans répertoire courant par défaut
 -d ou -f ou -l ou -d,f,l (par défaut): type dossier|fichier|liens
 +x :  0 par défaut: profondeur de répertoires minimum
 -y : 10 par défaut: profondeur de répertoires maximum
 -p : recherche uniquement dans le chemin de répertoire
 -n : recherche uniquement dans le nom de fichier/dossier en bout de chemin
      -> -n et -p: inutile, c'est la recherche par défaut
 -a,-all : affiche les fichiers cachés
 -ni : (= no ignore) sensible à la casse minuscule/majuscule (indifférent pas défaut)
 -s|-size N : recherche des N plus gros fichiers/répertoires (N=20 par défaut)
 -dempty : (= delete empty) suppression des fichiers et répertoires vides
 -delete : effacement des éléments trouvés, avec avertissement avant exécution, demande de confirmation
 -x|-exec : exécution de la commande qui suit, avec message d'avertissement par défaut
            (pas besoin de < {} \;> de find en fin de commande).
 -lnum : numérotation de chaque ligne
 -list : désactive le mode compact de présentation
 -nc : (= no color) supprime la couleur dans la sortie terminal
 -noinfo : n'affiche pas la synthèse du nombre de fichiers
 -nl|-nolimit: outrepasse la limite d'avertissement de plus de 250 fichiers
 --help: aide
  -h : synthèse arguments fdz
 --version

Exemple de sortie de recherche (mode compact):
2023-08-22_19-31

Quelques exemples:

fdz
fdz .cache/ /usr/share/locale -size 5
fdz -dempty
fdz -f -1 -exec ls -l
fdz -1 -a -f
fdz -2 -a -d
fdz /etc/dbus-1
fdz /usr/sbin/ /lib/systemd/ '*fsck*'
fdz /home/Musique/ /media/video/ '*.mp[34]'
fdz /usr/lib/modules/ +8 -10 '*rtl*'

――――――――――――――――――――――――――

⭐ fdz_0.1.0: **Nouveautés**:

-s|-size N : recherche des plus gros fichiers/dossiers (20 par défaut) d’un répertoire
( = présentation améliorée de la commande « du » )
$ fdz .cache/ /usr/share/locale -s 5 :
N est le nombre max de résultats par répertoire, et non pas une taille;

-lnum : numérotation des lignes

-dempty : recherche/effacement fichiers ou répertoires vides (fichiers+dossiers par défaut)

-delete : effacement des éléments trouvés, avec avertissement avant exécution, demande de confirmation

-x|-exec : exécute la commande qui suit les paramètres de recherche, avec demande de confirmation et rappel saisie commande (sécurité)
!! fdz ne vérifie pas plus que find la cohérence de la commande relativement à la recherche.
$ fdz /tmp/test/ -d -x rm : incohérent, rm ne sachant pas supprimer un répertoire (-d).
→ test préalable pour s’assurer de cette cohérence. fdz (ni find) ne réparent pas les erreurs de manip. fdz ajoute une sécurité. Pour certaines opérations, le traitement par « | xargs » peut aussi convenir, tous les cas de figure ne pouvant être testés. A comparer avec find.

Exemple:

$ mkdir -p /tmp/X/{A,B,C}
$ touch /tmp/X/A/Empty ; echo 'texte' > /tmp/X/B/NotEmpty
$ fdz /tmp/X/
  /tmp/X/
  /tmp/X/A
  /tmp/X/A/Empty
  /tmp/X/B
  /tmp/X/B/NotEmpty
  /tmp/X/C
  ――――――――――――――――――――――――――――――――――――――
  Total:6 [D:4 F:2 L:0] - Depth:2 /././

$ fdz /tmp/X/ -dempty
  /tmp/X/C
  /tmp/X/A/Empty
  !! on supprime ce qui est vide ? [y/n] ―> y

$ fdz /tmp/X/
  /tmp/X/
  /tmp/X/A
  /tmp/X/B
  /tmp/X/B/NotEmpty
  ――――――――――――――――――――――――――――――――――――――
  Total:4 [D:3 F:1 L:0] - Depth:2 /././

# nettoyage
$ fdz /tmp/X/ -delete

# recherche des fichiers binaires du répertoire bin/
$ fdz bin/ -f -1 -x grep . -IL

➤ fdz disponible sous forme de paquet debian

fdz_0.1.0-1 : mise à jour mineure

  • optimisation pour gros volumes: l’opération de tri n’est effectuée qu’après acception de poursuivre lors de l’avertissement de 250 lignes (inutile autrement).
  • légère modification ordre de tri en présence de fichiers cachés.

―――――――――――――――――

:star: fdz_0.1.1:

★ Lors de l’avertissement du nombre de résultats > 250, un aperçu des 15 permiers résultats est affiché.

★ Mode compact
Pour une profondeur de recherche importante, l’information utile du nom de fichier recherché se trouve dans la zone extrême droite de l’écran la moins confortable à visualiser; fdz ajoute un mode compact automatique activé par défaut à partir d’un certain seuil, et désactivable avec option -list.

/répertoire1/répertoire2/répertoire3/répertoire4/répertoire5/répertoire6/très_long_nom_de_fichier.xml

devient:

/répertoire1/répertoire2/répertoire3/répertoire4/répertoire5/répertoire6/
 ├ très_long_nom_de_fichier.xml

Le mode compact n’affecte en rien les actions -delete, -empty, -exec.
L’option -lnum (numérotation de lignes est incompatible avec l’option compact).

★ augmentation sécurité action -delete
find ne permet pas de savoir ce que sera l’effet de l’action ‹ -delete ›, particulièrement sur les répertoires conditionnés par les options -depth, -prune ou -path.
fdz avertit avant effacement, en listant explicitement les répertoires potentiellement à supprimer, en demandant confirmation.
――――――――――
fdz_0.1.1-1 : modifications mineures

• L’information de profondeur de recherche (depth) reflètera la valeur maximale relative aux différents répertoires de recherche donnés en argument, et non plus le dernier (ne change donc rien pour un seul répertoire de recherche)

• Modification position de recherche par défaut:
→ la recherche par défaut retenue sera -name (-n), donc dans le nom de fichier ou de répertoire, excluant le nom de chemin;
-p ou -path : recherche exclusive dans le nom de chemin de répertoire
-n -p ou -name -path : recherche globale, chemin et noms de fichier/dossier.
――――――――――
fdz_0.1.1-1_all.deb.txt (5,7 Ko) → !! debian package / pb extension forum

Installation: renommez fdz_0.1.1-1_all.deb.txt en fdz_0.1.1-1_all.deb
# apt install ./fdz_0.1.1-1_all.deb

fdz_0.1.1-1_all.deb
  Depends: bash (>= 4), coreutils, findutils
  md5sum : 62df9cdd9b45624b15f28a03f0ab7083
5 J'aime

Très bien Mais problème avec la gestion des couleurs :

fp2@debpacha:~/bin$ fdz  '*fmt' -noinfo -nc
B_fmt
c_fmt
p_fmt
s_fmt
fp2@debpacha:~/bin

Jusque là, pas de problème les 4 fichiers s’affichent sans couleur spéciale

p2@debpacha:~/bin$ fdz  '*fmt' -noinfo -nc | xargs ls -li
ls: impossible d'accéder à ''$'\033''[mB_fmt'$'\033''[m': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à ''$'\033''[mc_fmt'$'\033''[m': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à ''$'\033''[mp_fmt'$'\033''[m': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à ''$'\033''[ms_fmt'$'\033''[m': Aucun fichier ou dossier de ce type
fp2@debpacha:~/bin$

Les couleurs son revenues. Pensez à détecter si la sortie ne se fait pas dans un terminal et supprimez systématiquement les couleurs (tant pis pour less )

La remarque qu’on peut passer la sortie de fdz dans xargs est fausse actuellement.

fp2@debpacha:~/bin$ ls -li B_fmt c_fmt s_fmt p_fmt
262802 -rwxr-xr-x 4 fp2 fp2 786 11 juin   2022 B_fmt
262802 -rwxr-xr-x 4 fp2 fp2 786 11 juin   2022 c_fmt
262802 -rwxr-xr-x 4 fp2 fp2 786 11 juin   2022 p_fmt
262802 -rwxr-xr-x 4 fp2 fp2 786 11 juin   2022 s_fmt
fp2@debpacha:~/bin$

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة


F. Petitjean
Ingénieur civil du Génie Maritime. (à la retraite )

« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)

« Celui qui, parti de rien, n’est arrivé nulle part n’a de merci à dire à personne !! »
Pierre Dac

Très bien. Avec la V3, ça devrait marcher.
Edit: il n’est plus nécessaire de tester V3 d’il y a 4 jours, la version release 0.1.0 étant disponible (voir 1er message).

Info MAJ fdz 0.1.1 (voir 1er message)