Bonjour à tous,
Je souhaite convertir mes .jpg, .jpg, .gif, .png en webp
Ou plus précisément faire un copie en webp
J'ai
find . -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" \) -print0 | xargs -0 -I {} bash -c '[ ! -f "{}.webp" ] && { cwebp -q 82 -mt {} -o {}.webp; }'
Cependant, mon fichier de sortie sera > monfichier.jpg.webp
Comment faire pour éviter celà et simplement le renommer monfichier.webp
en supprimant l'extension d'origine.
EDIT [AUTOREPONSE:ON]
J'ai réussit en passant par un script
#!/bin/bash
for filename in ` find . -type f -iname "*cart_6_4*" -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif"`
do
cwebp -q 82 -mt "$filename" -o "${filename%.*}.webp";
done
En Revanche, si il y a un grand volume d'image à traiter ~1800 pour 5G
Passeriez vous par ce script ou rajouteriez vous une temporisation entre chaque conversion afin d'éviter de faire monter le server dans les tours ou d'autre opti?
# dirname/basename?
Posté par freem . Évalué à 2.
Je connais pas du tout bash (je préfère essayer de rester posix, pas encore eu a recourir à des bashismes ou zshisme pour le moment), et j'ai encore jamais eu l'utilité de xargs, mais je pense que j'aurai utilisé
basename
pour virer le suffix moi.En supposant que cwebp ne soit pas multithreadé, déjà, moi je lancerais plusieurs job simultanés. Et si il faut limiter le nombre, incrémenter un compteur jusqu'à une valeur définie et une fois atteinte, remplacer l'incrément par un
wait
.Après, vue la "complexité" de ton script, je doute que tu puisses grapiller des cycles en l'optimisant, je pense que le CPU est bouffé par cwebp, pas par bash.
Si le problème est de justement limiter l'usage des ressources, et non d'aller au plus vite, j'imagine qu'utiliser les cgroups via
tc
devrais pouvoir faire le job, mais je n'ai pas encore creusé cet aspect du contrôle des ressources, je l'avoue.[^] # Re: dirname/basename?
Posté par gotcha5832 . Évalué à 1.
Je te remercie.
Normalement cwebp est Multithreating
J'ai pas compris ce que tu voulais dire par
[^] # Re: dirname/basename?
Posté par freem . Évalué à 3.
Il semble que la commande tc permets de manipuler les cgroups, et il me semble que ces derniers peuvent appliquer des restrictions sur l'usage des ressources à un groupe de processus. Comme je l'ai dis, je n'ai pas encore beaucoup creusé le sujet, donc je n'ose pas m'avancer trop, mais si ton but est de restreindre les ressources de la conversion pour éviter de tuer le serveur, ça me semble une piste viable.
Et en écrivant ceci, je me souviens de la commande
nice
, qui permets à minima de gérer les priorités. Si tu donnes a webp une priorité faible, tu ne devrais pas trop impacter le serveur, je suppose. Reste à voir comment ça joue avec le swap, forcément.[^] # Re: dirname/basename?
Posté par Cyril Brulebois (site web personnel) . Évalué à 2.
nice
permet de céder la priorité niveau CPU à d'autres processus, en précisant qu'on n'est pas pressé. Même chose pourionice
sur les I/O. Quant àtc
, aux dernières nouvelles, c'était pourtraffic control
et la gestion des paquets… → https://en.wikipedia.org/wiki/Tc_(Linux)Debian Consultant @ DEBAMAX
# Commentaire supprimé
Posté par Ayazysn . Évalué à -1. Dernière modification le 11 novembre 2019 à 14:35.
Ce commentaire a été supprimé par l’équipe de modération.
# parallel
Posté par François GUÉRIN (Mastodon) . Évalué à 1.
Bonjour,
L'utilitaire
GNU parallel
https://www.gnu.org/software/parallel/ permet d'executer le script de conversion et utilsant plusieurs cores / threads.Je m'en sert pour traiter des lots de photos…
Courage !
# en bash
Posté par guitou . Évalué à 2. Dernière modification le 12 novembre 2019 à 19:17.
Bjr.
Ta subsitution à base de % est très bien, tu pourrais toutefois t'épargner la boucle for, avec une affectation de variable directement dans ta commande:
Voire, tu pourrais aussi remplacer tes -print0 et xargs par un -exec.
++
Gi)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.