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

 -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

 -list : désactive le mode compact de présentation
 -raw: affichage brut
 -perm : permission inclus mode octal
 -list : désactive le mode compact de présentation
 -lnum : numérotation de chaque ligne
 -nc : (= no color) supprime la couleur dans la sortie terminal
  -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 -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 historique:

-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

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.

――――――――――
:star: fdz_1.0: Nouveautés:

Ajout d’une fonction grep explicite ‹ -g,-grep › pour éviter les complications d’usage de ‹ -exec › ou ‹ xargs ›.
La recherche du contenu de fichiers est donc uniquement procédée sur les fichiers préalablement trouvés par fdz, grep n’ayant par défaut que deux modes de profondeur de recherche: soit répertoire courant , ou ‹ -r ›, récursif sans aucune limite.
‹ -g,-grep › active par défaut les options -E (regexp étendu), et -i (ignore-case = insensible casse Majuscule/minuscule), en améliorant la présentation de sortie.

exemple:

$ fdz -2 -a  /usr/lib/systemd/ ./  '*shortcut*' '*.list' '*service' \
     -grep 'dolphin|firefox|thunar'

/usr/lib/systemd/user/plasma-dolphin.service
 2: Description=Dolphin file manager
 6: ExecStart=/usr/bin/dolphin --daemon

./.config/mimeapps.list
  1: x-scheme-handler/http=firefox.desktop;
  2: x-scheme-handler/https=firefox.desktop;

./.config/kglobalshortcutsrc
  1: [firefox-esr.desktop]
  2: _k_friendly_name=Firefox ESR
 55: _launch=Meta+E,Meta+E,Dolphin

――――――――――

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).
―――――――――
Edit2 / 6 mois plus tard.
@littlejohn75
Ta remarque sur la gestion couleur ayant été prise en compte dans les 30 mn suivantes le 10 août dernier, ton message de 25 cm de hauteur, signature incluse, n’a plus d’utilité inséré entre le premier message, et les messages de MaJ qui suivent.
Si tu repasses un jour sur ce forum, aurais-tu l’obligeance soit de masquer ce vieux message , ou de le supprimer si tu conviens de son absence d’utilité depuis 6 mois.
Merci

→ masquage texte:

[details="Résumé"]
...ce texte sera masqué
[/details]

31-12-2023 - Mise à jour fdz 1.2-2

1.2.2/1.2.1: micro-ajustement pour cas particulier, peaufinage fin d’année / maj non nécessaire.
( changelog_1.2-1.txt (2,9 Ko) )

Points essentiels série 1.2-x:
→ introduction du mode ‹ -raw › (=brut) pour usage post-traitement avec | xargs
→ introduction du mode ‹ -perm › pour voir les permissions en mode octal

Exemples d’application:

$ fdz /etc/apt/ /usr/share/keyrings '*.gpg' -perm
 777 lrwxrwxrwx root:root  46   /etc/apt/trusted.gpg.d/debian-archive-keyring.gpg ->/usr/share/keyrings/debian-archive-keyring.gpg
 644 -rw-r--r-- root:root 2.9K  /etc/apt/keyrings/ookla_speedtest-cli-archive-keyring.gpg
 644 -rw-r--r-- root:root 7.4K  /etc/apt/trusted.gpg
 644 -rw-r--r-- root:root  57K  /usr/share/keyrings/debian-archive-keyring.gpg
 644 -rw-r--r-- root:root 2.4K  /usr/share/keyrings/opera.gpg

$ fdz /etc/cups -perm
 755 drwxr-xr-x root:lp     4.1K  /etc/cups/ppd/
 700 drwx------ root:lp     4.1K  /etc/cups/ssl/
 600 -rw------- root:lp      111  /etc/cups/classes.conf
 644 -rw-r--r-- root:root   2.9K  /etc/cups/cups-files.conf

$ fdz -2 -a '*shortcut*' '*.list' -grep 'dolphin|firefox|thunar'

$ fdz /usr/lib/modules/ +8 -10 '*rtl*'

Installation:

P=./fdz_1.2-2_all.deb
curl -o $P https://www.debian-fr.org/uploads/short-url/9mlsfZJGMkwb3svhKUIccvmXLHW.txt

md5sum $P |grep -so '2d562ad5df44ed61836c98d01cb40212' && sudo dpkg -i $P
fdz --version
 fdz 1.2-2

fdz_1.2-2_all.txt (5,2 Ko)

Astuce:
Pour un utilisateur qui n’aime pas la couleur par exemple, il est possible de créer un alias:
alias fdz='fdz -nc'

1 J'aime