| 📰 La Revue de TheRaphit.com | Article n° 43 [22 février 2026] |
[Article au hasard 🎲]
[Précédent]
|
find avec -exec ou xargs]
[La boucle shell]
cut et awk]
[Le tuning haute performance]
|
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. |
find avec -exec ou xargs ‹‹‹Il s'agit sans doute de l'astuce que j'utilise le plus ! Cela consiste à utiliser la commandefindpour obtenir une liste de fichiers, puis ensuite appliquer à chaque fichier trouvé une commande quelconque. L'avantage defindc'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 defindque j'utilise tout le temps :Il est très important de bien préciser la chaînefind [<options>] <répertoire> [-type <type_fichier>] -name <masque> -exec <commande> {} \; [<extra_options>]{}qui indique que l'argument de la commande doit être le nom de fichier trouvé parfind. Il faut également terminer par\;qui indique à l'utilitaire que la directive-execse 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 totoet-name "*toto*"sont en réalité équivalents.
Enfin pour les options, celles que j'emploie tout le temps est tout d'abord-Lqui permet de suivre les liens symboliques, parce que j'en ai plein dans les répertoires du site. :-) Pour les options supplémentaires,-execva se substituer à l'affichage normal defindqui consiste normalement à produire une liste de fichiers.
Un petit exemple ?
![]()
Ici j'ai recherché dans tous les articles de La Revue (numérotés et conformes au masquerev??.html) une occurence du textea 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 pargrep.
Ce même article (n° 43) que vous lisez en ce moment fait donc partie des résultats. A noter que l'option
Certains préfèrent plutôt utiliserfindavecxargsqui est un utilitaire permettant de construire des listes d'arguments. Personnellement j'ai une préférence pour-execcar 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 avecxargs.
Mettons que vous souhaitez savoir si vous avez des fichiers vidéo en.mp4dans 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 :Cela produira une sortie parfaitement identique à celle que vous auriez obtenue en utilisantfind . -name "*.mp4" | xargs ls -lhls -lhdirectement sur les fichiers, sans rajout. C'est donc idéal pour retraiter la sortie au sein d'un script notamment.
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'utilitaireseqqui permet justement de produire des listes de nombres.
Voici le genre de boucle en ligne de commande unique que j'utilise souvent :Il est important de bien utiliser des backquotesfor n in `seq <valeur_initiale> <valeur_finale>` ; do <commande> ; done`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 pardone!
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 typetrmpz-ai-hentai-2160p-161.pngque j'ai remplacé parnoellys-ai-hentai-2160p-161.pngavec exactement ce genre de boucle, étant donné que la numérotation séquentielle des fichiers s'y prêtait parfaitement.
![]()
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 ailleursseqvous permet aussi, avec les bonnes options, de changer l'incrémentation ou même de générer des suites de nombres décimaux.
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'utilitairecutest 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 :Chaque champ du fichiercut -d: -f1,5 /etc/passwd/etc/passwdest 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 :Et voici ce que j'ai pu obtenir en utilisant2803: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"cut, avec l'assistance de quelques autres utilitaires :
![]()
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 partrmpz-hentai-wallpaper. Il faut ensuite éliminer les entrées concernantfavicon.icocar 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.pngpour ne pas tenir compte des miniatures, qui sont en.jpg.
Ensuite, c'est là qu'intervientcutune première fois, où je ne vais garder que la partie de la ligne qui suit le premier double-quote, juste avant leGET. A partir de là,cutest appliqué une seconde fois, cette fois pour extaire le nom du fichier image qui suit immédiatement leGET. L'option-wdecutest utile pour traiter une quantité quelconque de « blancs », que ce soit des espaces ou des tabulations.
A partir de là,sortva regrouper toutes les lignes identiques, ce qui est nécessaire pour que l'étape suivante fonctionne correctement, à savoir employer l'utilitaireuniqqui supprime toutes ces lignes identiques sauf une. L'option-cde celui-ci ajoute le nombre d'occurences qui ont été vues.
Il ne reste plus qu'à appliquersortune nouvelle fois, avec l'option-rpour obtenir un ordre décroissant, afin de trier suivant le nombre d'occurences. Enfinhead -10permet de finaliser en ne listant que les dix images les plus téléchargées.
De son côté,awkest 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 :
![]()
Les détails sur cette ligne de commande.
L'appel àfindpermet de lister tous les fichiers MP4 dans le sous-répertoireevangelion/du site, dont on obtient ensuite la taille avecls(notez l'utilisation dexargsplutôt que-exec). Dans la sortie dels, la taille du fichier est le cinquième champ, et la première instruction passée àawkconsiste 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,awkaffiche toutes les sommes intermédaires. Seule la dernière ligne nous intéresse donc, d'où letail -1. La dernière partie de la suite de commandes permet de passer l'affichage en megaoctets viabcpuis à rappelerawkpour 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 defind,xargsetawkpermet d'obtenir un résultat qu'il serait bien plus laborieux à obtenir avec l'utilitairedu, ou même avec la version GNU delsqui 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 deawkreste d'extraire des champs avec$1, $2, ...plus facilement qu'aveccut, et c'est ce que j'utilise pour ma configuration tmux, au niveau des scripts de statuts.
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 commandesysctlet 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 utilisersysctl -pen tant querootpour 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 commandesysctlde FreeBSD diffère légèrement de celle de Linux, ici pour appliquer tous ces paramètres en une seule fois, en tant querootfaites :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 avecsysctl -f /etc/sysctl.confsysctldoivent ê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'utilitairenocacheque 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 !
Dans la partie de cette page concernantawketcut, 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 :Il n'existe cependant pas d'option<details class="exemple_details" open="true">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'attributopenentièrement.
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 !
![]()
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 encyan italiquesont ceux que vous pouvez personnaliser.Pour que cela soit interprété, vous devez aussi ajouter
<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" />
xmlns:og="https://ogp.me/ns#"à votre balise initiale HTML, par exemple comme ceci :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.<html lang="fr" xmlns:og="https://ogp.me/ns#">
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.
Je poursuis la tradition historique de conclure en vous listant quelques ressources disponibles sur Internet, tout comme avec l'article n° 28. :-)
- Linux Man Pages Online - Si vous n'avez pas encore installé Linux ou que vous n'en avez pas un sous la main, vous pouvez consulter les pages
mandirectement en ligne sur ce site. Notamment je vous encourage à consulter celles defind,seqetawkpour approfondir.- FreeBSD Manual Pages - La même chose mais pour FreeBSD, et cette fois cela vient du site officiel. Ils utilisent même encore des CGI pour cela, ah là là ce sont vraiment des gens_bien™ chez FreeBSD.
- A Guide to FreeBSD Performance Tuning - Egalement pour FreeBSD ! Vu que la littérature s'y rapportant est nettement moins pléthorique qu'en ce qui concerne Linux, les bons guides sont plus difficiles à trouver... Voici donc une page plus détaillée pour ceux qui souhaitent en savoir davantage sur les réglages fins qu'il est possible de faire pour optimiser les performances de ce système.
- The Open Graph Protocol - Je n'utilise avec mon site qu'une toute petite partie de ce qu'il est possible de faire avec Open Graph. Rien de tel que le site officiel pour en découvrir toutes les subtilités.