Forum Linux.débutant fichier de sortie sans l'extension du fichier source

Posté par . Licence CC by-sa.
Tags :
1
10
nov.
2019

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 . Évalué à 2 (+0/-0).

    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.

    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?

    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 . Évalué à 1 (+0/-0).

      Je te remercie.

      Normalement cwebp est Multithreating

      -mt Use multi-threading for encoding, if possible. This option is only effective when using lossy compression on a source with a trans‐
      parency channel.

      J'ai pas compris ce que tu voulais dire par

      j'imagine qu'utiliser les cgroups via tc

      • [^] # Re: dirname/basename?

        Posté par . Évalué à 3 (+1/-0).

        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.

  • # Commentaire supprimé

    Posté par . Évalué à -1 (+0/-2). Dernière modification le 11/11/19 à 14:35.

    Ce commentaire a été supprimé par l'équipe de modération.

  • # parallel

    Posté par . Évalué à 1 (+0/-0).

    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 . Évalué à 2 (+1/-0). Dernière modification le 12/11/19 à 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:

    dst={} && cwebp -q 82 -mt {} -o "${dst%.*}.webp"

    Voire, tu pourrais aussi remplacer tes -print0 et xargs par un -exec.

    ++
    Gi)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.