📰 La Revue de TheRaphit.com Article n° 43 [22 février 2026] [Article au hasard 🎲] [Précédent]  Dernier 

Les petites astuces
quotidiennes de TheRaphit


– UNIX & Shell –

[L'emploi de find avec -exec ou xargs] [La boucle shell]
[L'utilisation de cut et awk] [Le tuning haute performance]


– HTML & Web –

[Volet affichable à la demande] [Le protocole Open Graph]





Au moment de la rédaction de l'article anniversaire, il était prévu d'intégrer, en tant que bonus, toutes les petites ficelles que j'utilise quotidiennement depuis plus d'un an pour gérer le site depuis que je l'ai remis en ligne, que ce soit au niveau des serveurs (UNIX) ou du contenu (HTML).

Ne l'ayant finalement pas fait pour ne pas charger l'article alors que ce n'était pas directement dans le thème, je vous avais donc annoncé que cela ferait l'objet d'un nouvel article... Que voici !

Le but ici n'est pas d'être exhaustif pour ne pas être rébarbatif (ça rime). C'est un petit recueil d'astuces rapides, mais qui vous donneront une bonne base vous permettant de mettre au point les vôtres.



– UNIX & Shell –


››› L'utilisation de find avec -exec ou xargs ‹‹‹


Il s'agit sans doute de l'astuce que j'utilise le plus ! Cela consiste à utiliser la commande find pour obtenir une liste de fichiers, puis ensuite appliquer à chaque fichier trouvé une commande quelconque. L'avantage de find c'est qu'il peut explorer tous les sous-répertoires avec une profondeur que vous pouvez spécifier. C'est un utilitaire qui a énormément d'arguments et de possibilités.

Voici donc le type de find que j'utilise tout le temps :
find [<options>] <répertoire> [-type <type_fichier>] -name <masque> -exec <commande> {} \; [<extra_options>]
Il est très important de bien préciser la chaîne {} qui indique que l'argument de la commande doit être le nom de fichier trouvé par find. Il faut également terminer par \; qui indique à l'utilitaire que la directive -exec se termine. Pour les masques de nom de fichier, si vous utilisez un wildcard, par exemple *.txt, il est également nécessaire de les mettre entre double-quotes ("). Notez que -name toto et -name "*toto*" sont en réalité équivalents.

Enfin pour les options, celles que j'emploie tout le temps est tout d'abord -L qui permet de suivre les liens symboliques, parce que j'en ai plein dans les répertoires du site. :-) Pour les options supplémentaires, -print permet d'afficher le nom du fichier après l'exécution de la commande. En effet -exec va se substituer à l'affichage normal de find qui consiste normalement à produire une liste de fichiers.

Un petit exemple ?


[Exemple d'utilisation de 'find']


Ici j'ai recherché dans tous les articles de La Revue (numérotés et conformes au masque rev??.html) une occurence du texte a href="rev40.html, de manière à connaître tous ceux où figure un ou plusieurs liens vers le quarantième. Notez le caractère '\' servant à échapper le double-quote, c'est à dire l'interpréter en tant que ce même caractère, et non comme la fin de la chaîne recherchée par grep.

Ce même article (n° 43) que vous lisez en ce moment fait donc partie des résultats. A noter que l'option -print affichera le nom du fichier après l'exécution de la commande.

Certains préfèrent plutôt utiliser find avec xargs qui est un utilitaire permettant de construire des listes d'arguments. Personnellement j'ai une préférence pour -exec car il est possible de faire suivre plus simplement l'argument principal - noté par {} - par d'autres. Cependant, dans la plupart des cas où vous exécutez une commande plutôt basique, ce sera en effet très simple avec xargs.

Mettons que vous souhaitez savoir si vous avez des fichiers vidéo en .mp4 dans un répertoire et ses sous-répertoires, et que le cas échéant, vous souhaitez connaître leur taille. Vous pouvez utiliser par exemple :
find . -name "*.mp4" | xargs ls -lh
Cela produira une sortie parfaitement identique à celle que vous auriez obtenue en utilisant ls -lh directement sur les fichiers, sans rajout. C'est donc idéal pour retraiter la sortie au sein d'un script notamment.


››› La boucle shell ‹‹‹


Dans un script shell, vous pouvez bien évidemment utiliser des boucles.

Mais saviez-vous qu'il est aussi possible d'en utiliser une directement à la ligne de commande ? Cela vous permet d'effectuer des opérations en chaîne à l'aide d'un compteur et de variables, et ce sans avoir à écrire d'abord un script dans un fichier, le rendre exécutable, pour enfin le lancer. Pour générer le compteur, vous pouvez employer l'utilitaire seq qui permet justement de produire des listes de nombres.

Voici le genre de boucle en ligne de commande unique que j'utilise souvent :
for n in `seq <valeur_initiale> <valeur_finale>` ; do <commande> ; done
Il est important de bien utiliser des backquotes ` pour encadrer la commande générant le compteur. Egalement, il ne faut pas oublier d'utiliser les séparateurs ; (points-virgule) et de terminer par done !

Je me suis servi de ce type de boucle lorsque j'ai séparé la Pink Zone 2025 en deux sites distincts pour ouvrir le Noellys' Hentai World. Les fichiers sur la Pink Zone avaient un nom de type trmpz-ai-hentai-2160p-161.png que j'ai remplacé par noellys-ai-hentai-2160p-161.png avec exactement ce genre de boucle, étant donné que la numérotation séquentielle des fichiers s'y prêtait parfaitement.


[Exemple de boucle shell]


Pour la lisibilité, notez que je n'ai reproduit l'expérience que sur les neuf premiers fichiers, mais vous pouvez bien sûr utiliser de grandes séquences de nombres. Par ailleurs seq vous permet aussi, avec les bonnes options, de changer l'incrémentation ou même de générer des suites de nombres décimaux.


››› L'utilisation de cut et awk ‹‹‹


Ces deux petits utilitaires peuvent être utilisés dans des scripts pour traiter des chaines de caractères issues de logs ou de sorties d'autres commandes UNIX.

L'utilitaire cut est assez simple, et comme son nom l'indique il sert à découper des portions d'un fichier avant de les afficher. Il fonctionne avec un système de champs et de délimiteurs vous permettant d'extraire seulement les informations qui vous intéressent. Par exemple, pour afficher la liste des utilisateurs du système en ne conservant que le nom d'utilisateur et la description (GECOS) vous pouvez utiliser :
cut -d: -f1,5 /etc/passwd
Chaque champ du fichier /etc/passwd est en effet délimité par ':' et les informations souhaitées sont les champs n° 1 et n° 5.

Je me sers personnellement de cet utilitaire pour retraiter les logs de mon serveur Web, par exemple pour construire une liste des images les plus téléchargées sur la Pink Zone 2025. Une entrée correspondant au téléchargement d'une image ressemble à ceci :
2803:a3e0:1732:ee20:7d0b:4430:dc48:6d9 www.theraphit.com - [04/Jan/2026:01:03:39 +0100] "GET /hentai-wallpaper/1080p/trmpz-hentai-wallpaper-1080p-25.png HTTP/2.0" 200 1343224 "https://www.theraphit.com/hentai-wallpaper/en/1080p.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
Et voici ce que j'ai pu obtenir en utilisant cut, avec l'assistance de quelques autres utilitaires :


[Exemple d'utilisation de 'cut']


Quelques explications plus détaillées sur cette ligne de commande, si cela vous intéresse !
Tout d'abord, il faut extraire du fichier les entrées correspondant aux images, dont les noms commencent tous par trmpz-hentai-wallpaper. Il faut ensuite éliminer les entrées concernant favicon.ico car elles apparaissent au moment du chargement de l'icône du site lorsque les visiteurs ont ouvert l'image dans un nouvel onglet de leur navigateur - le nom de celle-ci est alors vu en tant que referrer, ce qui ne correspond pas à un téléchargement. Je n'inclus ensuite que les fichiers .png pour ne pas tenir compte des miniatures, qui sont en .jpg.

Ensuite, c'est là qu'intervient cut une première fois, où je ne vais garder que la partie de la ligne qui suit le premier double-quote, juste avant le GET. A partir de là, cut est appliqué une seconde fois, cette fois pour extaire le nom du fichier image qui suit immédiatement le GET. L'option -w de cut est utile pour traiter une quantité quelconque de « blancs », que ce soit des espaces ou des tabulations.

A partir de là, sort va regrouper toutes les lignes identiques, ce qui est nécessaire pour que l'étape suivante fonctionne correctement, à savoir employer l'utilitaire uniq qui supprime toutes ces lignes identiques sauf une. L'option -c de celui-ci ajoute le nombre d'occurences qui ont été vues.

Il ne reste plus qu'à appliquer sort une nouvelle fois, avec l'option -r pour obtenir un ordre décroissant, afin de trier suivant le nombre d'occurences. Enfin head -10 permet de finaliser en ne listant que les dix images les plus téléchargées.

De son côté, awk est plus complexe car il s'agit d'un langage de programmation à part entière, vous pouvez même faire des maths avec. Voici un petit exemple :


[Exemple d'utilisation de 'awk']


Les détails sur cette ligne de commande.
L'appel à find permet de lister tous les fichiers MP4 dans le sous-répertoire evangelion/ du site, dont on obtient ensuite la taille avec ls (notez l'utilisation de xargs plutôt que -exec). Dans la sortie de ls, la taille du fichier est le cinquième champ, et la première instruction passée à awk consiste donc à ajouter les valeurs numériques de ces champs, les uns après les autres. Une fois fini, la valeur totale de la somme est affichée.

La suite est essentiellement du formatage. Lors du traitement de chaque fichier, awk affiche toutes les sommes intermédaires. Seule la dernière ligne nous intéresse donc, d'où le tail -1. La dernière partie de la suite de commandes permet de passer l'affichage en megaoctets via bc puis à rappeler awk pour afficher le résultat final arrondi, sans décimale.

Oui, il y a pour 17 016 Mo de vidéos Evangelion en MP4 sur le serveur. :-) Précision à part, cette petite alliance de find, xargs et awk permet d'obtenir un résultat qu'il serait bien plus laborieux à obtenir avec l'utilitaire du, ou même avec la version GNU de ls qui affiche un total lors de l'utilisation de l'option -l, pour peu que le filtre soit subtil.

Au quotidien, l'utilisation la plus pratique de awk reste d'extraire des champs avec $1, $2, ... plus facilement qu'avec cut, et c'est ce que j'utilise pour ma configuration tmux, au niveau des scripts de statuts.


››› Le tuning haute performance ‹‹‹


Les moteurs de recherche, notamment Google, pratiquent le throttle : c'est à dire qu'ils n'affichent pas en permanence dans leurs résultats le lien d'un site auquel ils envoient beaucoup de visiteurs, dans le but que la machine hébergeant celui-ci n'arrive pas à saturation de ses ressources.

Pour évaluer la réactivité d'un serveur, ils exploitent les remontées d'informations de Chrome, le navigateur le plus utilisé au monde. On peut discuter du bien fondé de la méthodologie - et cela fera peut-être l'objet d'un article sur La Revue. Mais en attendant, si vous disposez d'un serveur suffisamment costaud, il est recommandé de procéder à quelques petits réglages afin d'améliorer la responsiveness de votre site, et éviter au maximum de perdre des visiteurs potentiels !

Les différentes valeurs système utilisées par défaut sur FreeBSD et les distributions Linux sont plutôt conservatrices. Pour les changer, vous allez employer la commande sysctl et ajuster la configuration globale du noyau, mais plus particulièrement la taille de différents tampons mémoire liés au réseau.

Sous Linux, vous pouvez notamment ajouter les éléments suivants à votre fichier /etc/sysctl.conf :


# Kernel Swap Management
vm.swappiness=10

# TCP Buffer Size
net.ipv4.tcp_rmem=4096 131072 6291456
net.ipv4.tcp_wmem=4096 131072 6291456

# TCP Connection Parameters
net.ipv4.tcp_max_syn_backlog=4096

# Congestion Control
net.ipv4.tcp_congestion_control=bbr

# Network Memory Management
net.core.rmem_max=6291456
net.core.wmem_max=16777216

Il n'est pas nécessaire de redémarrer votre machine par la suite, vous pouvez utiliser sysctl -p en tant que root pour appliquer tous ces paramètres d'un seul coup.

Sous FreeBSD maintenant, voici ce que je vous propose d'ajouter dans votre /etc/sysctl.conf :


# TCP Buffer Size
net.inet.tcp.sendspace=262144
net.inet.tcp.recvspace=262144

# TCP For Large Transfers
net.inet.tcp.delayed_ack=0
net.inet.tcp.mssdflt=1448
net.inet.tcp.minmss=536

# TCP Connection Parameters
kern.ipc.somaxconn=8192
net.inet.tcp.fastopen.server_enable=1

# Congestion Control
net.inet.tcp.cc.algorithm=cubic

# Connection Timeouts
net.inet.tcp.keepinit=5000

# Network Memory Management
kern.ipc.maxsockbuf=16777216
net.inet.tcp.recvbuf_max=16777216
net.inet.tcp.sendbuf_max=16777216

# FIN_WAIT_2 State
net.inet.tcp.finwait2_timeout=30000

La commande sysctl de FreeBSD diffère légèrement de celle de Linux, ici pour appliquer tous ces paramètres en une seule fois, en tant que root faites :
sysctl -f /etc/sysctl.conf
Toutefois sous FreeBSD, certains paramètres dont je me sers ne sont modifiables qu'au démarrage du système. Ces réglages, bien que ressemblant à ceux modifiables avec sysctl doivent être, eux, insérés dans le fichier /boot/loader.conf :


# TCP Connection Parameters
net.inet.tcp.syncache.bucketlimit="1024"
net.inet.tcp.syncache.cachelimit="30720"

# Interface Queue Length
net.link.ifqmaxlen="2048"

A ce que j'en ai lu, ici il faut encader les différentes valeurs par un double-quote.

Ces réglages sont parfaitement safe sous FreeBSD 14.x puisque ce sont ceux que j'utilise sur mon serveur Web, celui depuis lequel vous avez chargé cette page. :-) Je les utilise également sur le serveur Linux du Noellys' Hentai World (distribution Ubuntu 24.04.3).

A noter que sous Linux, vous disposez également de l'utilitaire nocache que vous pouvez éventuellement installer : celui-ci permet d'exécuter n'importe quelle commande sans que cela provoque une mise en cache des fichiers éventuellement traités par celle-ci. Cela évite la pollution de cache, notamment lors de l'exécution de certaines tâches automatiques du système. Sur la distribution Ubuntu, les différents scripts de maintenance sont prévus pour l'utiliser, si vous l'avez installé (ce n'est pas fait par défaut).

Ceci permet de vous assurer qu'un maximum de données de votre site pourront être mises en cache et servies directement depuis celui-ci !


– HTML & Web –


››› Volet affichable à la demande ‹‹‹


Dans la partie de cette page concernant awk et cut, une partie du texte a été logé dans un volet « dépliable » qui n'est pas affiché par défaut au chargement de la page et présentant des détails supplémentaires pouvant ne pas intéresser le lecteur. C'est aussi le cas de la FAQ officielle du site où j'en ai fait un usage intensif, car le but premier de la page n'est pas d'être lue dans l'ordre ni en intégralité. J'ai même caché l'introduction dans un de ces volets, pour encore mieux mettre en valeur les intitulés de chacune des questions.

Cela me sert aussi de zone anti-spoiler, comme sur mon article au sujet du roman 1984 de George Orwell, ou encore pour diverses autres surprises, à vous de les découvrir. :-)

Si vous cherchez sur Internet comment faire cela, ou même si vous demandez autour de vous, on va vous répondre que vous pouvez utiliser un petit JavaScript. Il y a littéralement plusieurs pages de résultats Google pointant vers des liens donnant des exemples de scripts, et c'est aussi la seule manière de faire que conseille leur « IA »...

Mais ce n'est en réalité absolument pas nécessaire ! Il est possible de faire cela en pur HTML, juste avec <details>...</details> comme ci-dessous :

Cliquez pour afficher le code HTML de ce volet
<details class="exemple_details">
<summary><u>Cliquez pour afficher le code HTML de ce volet</u></summary>
<blockquote>
(... ici s'insère ce même texte ...)
</blockquote>
</details>

Il vous est même possible d'imbriquer un nombre quelconque de ces volets les uns dans les autres, ce qui doit être plus délicat à réaliser en JavaScript... Alors qu'avec <details> il vous suffit juste d'ajouter une nouvelle balise dans la partie du code correspondant à un volet. Il faut seulement veiller à bien refermer ensuite toutes les balises dans l'ordre souhaité.

Notez qu'au chargement ou au rechargement de la page - que ce soit manuel ou automatique (par un éventuel script) - le volet est fermé par défaut. Si vous souhaitez qu'il soit ouvert, alors vous pouvez utiliser :
<details class="exemple_details" open="true">
Il n'existe cependant pas d'option open="false" que vous pourriez insérer dans votre code HTML afin d'en faciliter la maintenance. Pour retrouver des volets fermés par défaut, il faut retirer l'attribut open entièrement.


››› Le protocole Open Graph ‹‹‹


Il s'agit d'une invention de Facebook (!) permettant d'afficher des informations complémentaires sur une page Web lorsque le lien vers celle-ci est partagé sur un réseau social.

Aujourd'hui c'est massivement reconnu, bien en dehors des applications de la société Meta. Partager un lien sur Discord ou Signal affichera les informations contenues dans les tags Open Graph de la page, et ce sera même le cas avec certaines applications Android lorsque vous envoyez un SMS !


[Open Graph avec WhatsApp]

Un exemple sur WhatsApp avec le lien vers l'article n° 40


Les informations affichées ne sont pas du tout prises au hasard, mais spécifiquement indiquées dans l'en-tête du code HTML de la page via des balises <meta>.

Voici le template que j'utilise, les textes en cyan italique sont ceux que vous pouvez personnaliser.
<meta property="og:title" content="le titre de votre page" />
<meta property="og:type" content="'website' pour votre page d'accueil, 'article' pour une sous-page" />
<meta property="og:url" content="URL complet - avec 'http(s)://' devant - de votre page" />
<meta property="og:image" content="URL complet de votre image d'illustration" />
<meta property="og:site_name" content="nom de votre site" />
<meta property="og:locale" content="code 'langue' de la page, par exemple fr_FR" />
<meta property="og:description" content="la description que vous voulez voir s'afficher" />
Pour que cela soit interprété, vous devez aussi ajouter xmlns:og="https://ogp.me/ns#" à votre balise initiale HTML, par exemple comme ceci :
<html lang="fr" xmlns:og="https://ogp.me/ns#">
Pour la taille de l'image, Facebook recommandait initialement la résolution 1200 × 630. C'est le standard que j'ai adopté sur mon site, mais il est dorénavant possible d'utiliser à peu près n'importe quel format.

Ces balises vous permettront d'obtenir le résultat que vous voyez ci-dessus. Ce ne sont pas les seules informations que vous pouvez ajouter, très loin de là ! Le lien vers le site officiel de l'Open Graph (à la fin de cette page) vous permettra d'approfondir.

Quelques liens utiles pour finir


Je poursuis la tradition historique de conclure en vous listant quelques ressources disponibles sur Internet, tout comme avec l'article n° 28. :-)

La Revue de TheRaphit.com

[Compteur]
Nombre de visiteurs
depuis le 13 mai 1997.


[Accueil] [C'est quoi ?]

TheRaphit's Web Site - La dernière homepage du Web


[(Tout)2 Evangelion] Webzine : La Revue [Manga Pink Zone] [Mathématiques]

[Nouveautés] [Zone de téléchargement]


Site créé le 16 janvier 1997
©1997-2026 by TheRaphit

www.theraphit.com