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
3 Réponses :
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
complètement inutile. ce sont des formats différents, le changement d'extension est insuffisant.
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
où {.}
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.
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.
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 :)
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/…