7
votes

Convertir des images Webp en PNG par la commande Linux

J'ai de nombreuses webp format images in a folder but with extension .jpg` comme

abc-test.png

C'est une image au format webp . Je veux le convertir au format .png avec le même nom pour cela j'ai utilisé cette commande et cela a fonctionné

abc-test.jpg.png

Il a converti toutes les images webp en .png mais le problème est d'enregistrer des images comme celle-ci:

find . -name "*.jpg" -exec dwebp {} -o {}.png \;

Comment puis-je l'enregistrer sans l'extension .jpg comme

abc-test.jpg


1 commentaires

Ma réponse, ou toute autre, a-t-elle réglé votre problème? Si tel est le cas, pensez à l'accepter comme votre réponse - en cliquant sur la coche / coche vide à côté du décompte des votes. Sinon, veuillez indiquer ce qui n'a pas fonctionné afin que moi ou quelqu'un d'autre puisse vous aider davantage. Merci. meta.stackexchange.com/questions/5234/…


3 Réponses :


-2
votes

Une bonne chose à faire est d'utiliser sed avec mv. Il correspond au modèle et le remplace par un plus récent.

for file in *.jpg;
do
   mv "$file" "`echo $file | sed s/.jpg/.png/`"
done

si vous souhaitez conserver les anciens fichiers au lieu de mv, vous pouvez utiliser cp


1 commentaires

complètement inutile. ce sont des formats différents, le changement d'extension est insuffisant.



7
votes

Si vous en avez beaucoup à convertir / renommer, je vous recommande d'utiliser GNU Parallel et non seulement de les convertir plus rapidement en les faisant en parallèle, mais aussi de profiter de la possibilité de modifier les noms de fichiers.

La commande que vous souhaitez est:

find . -name "*.jpg" -print0 | parallel -0 dwebp {} -o {.}.png

{.} signifie "le nom de fichier sans l'extension d'origine" .

Si vous souhaitez également rentrer dans les sous-répertoires, vous pouvez utiliser:

parallel dwebp {} -o {.}.png ::: *.jpg

Si vous voulez un compteur de progression, ou une "heure d'arrivée estimée" , vous pouvez ajouter --progress ou --eta après la commande parallel .

Si vous voulez voir ce que GNU Parallel exécuterait, sans rien exécuter, ajoutez --dry-run .

Je vous recommande GNU Parallel à cette époque où les processeurs deviennent «plus gros» (plus de cœurs) plutôt que plus rapides.


0 commentaires

0
votes

Je l'ai fait avec un oneliner court qui ne nécessite pas l'installation de parallel dans le système

for x in `find . -name "*.jpg"`; do dwebp {} -o ${x%.*}.png ::: $x; done

Et cela fonctionne pour le répertoire actuel

J'essaierais de modifier la solution récursive @ mark-setchell pour qu'elle ressemble à ceci:

for x in `ls -1 *.jpg`; do dwebp {} -o ${x%.*}.png ::: $x; done

La partie ${x%.*} Est celle qui nécessite un mot d'explication ici - elle dit à bash de prendre . et tout après le point de la variable x . Il est enclin à mal se comporter pour les noms avec plus de points car je n'ai pas vérifié si l'expression régulière ici est paresseuse ou gourmande - la réponse peut donc être ajustée davantage.


3 commentaires

Il est de loin préférable d'utiliser for x in *.jpg plutôt que d'analyser la sortie de ls - voir mywiki.wooledge.org/ParsingLs


Vos commandes ont toutes les deux des ::: superflus au milieu - probablement des restes de GNU Parallel


@MarkSetchell merci, TIL - vérifiera cela et corrigera la réponse si tout fonctionne bien, donc c'est aussi propre que possible :)