Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Hier à 19:49

cristobal78

Limiter l'actionde la Cde "convert" aux fichiers jpg d'un dossier

Bonjour à tous
J'ai écrit un script pour réduire le poids de plusieurs lots de fichiers JPEG.
Il s’exécute d'un click droit sur une liste de fichiers affichés par l'explorateur "nemo"
En théorie il ramène le poids P à 0.8 x P mais en fait c'est très variable.
Ce qui est sur c'est que chaque fichier ainsi traité voit son poids diminuer significativement sans dégât sur la qualité de l'image.
Le script :

#!/bin/bash
# nom du script = jpeg-downsize-80pct
# réduit le "poids" de photos à 80% de sa valeur initiale
# Nécessite "imagemagick"

### variables
type_de_fich="jpeg"
est_pas="Fin du programme :\n\n ce fichier n'est pas au format "
list_paq_requis="imagemagick"
taux=80

### fonctions
test_format_in () { if [[ $(file --brief --mime-type "$1") != *$3 ]]; then zenity --error --text="$2 $3"; exit ; fi ; }

### script ###
while [ $# -gt 0 ] ; do
	fichier=$1
    test_format_in "$fichier" "$est_pas" "$type_de_fich"   # on sort si le fichier n'est pas jpeg

	# le fichier d'origine est conservé et le fichier de poids réduit prend le nom du fichier d'origine avec le suffixe "-80pct"
	convert "$fichier" -quality "$taux" "$fichier""-$taux"pct 
    shift
done

Résultat.
Si je n'ai sélectionné QUE des fichiers de type mime "JPEG" le script fonctionne parfaitement.
En revanche s'il rencontre sur sa route un fichier qui n'est pas JPEG alors il s’arrête.

Ce que je voudrais c'est qu'il "laisse tomber" ce fichier qui n'est pas JPEG et qu'il poursuive tranquillement sa route et traite les fichiers JPEG qui suivent.
Et là je ne vois pas comment faire  hmm


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Hier à 20:29

kamaris

Re : Limiter l'actionde la Cde "convert" aux fichiers jpg d'un dossier

return 1 au lieu de exit dans test_format_in, et

test_format_in "$fichier" "$est_pas" "$type_de_fich" || continue

dans la boucle.

Hors ligne

#3 Hier à 21:21

Watael

Re : Limiter l'actionde la Cde "convert" aux fichiers jpg d'un dossier

cette fonction ne sert à rien.

#!/bin/bash

taux=80

for fichier do
    if [[ $(file --brief --mime-type "$fichier") != *jpeg ]]
    then
        zenity --error --text="\"$fichier\" n'est pas au format JPEG"
        continue
    fi
    # le fichier d'origine est conservé et le fichier de poids réduit prend le nom du fichier d'origine avec le suffixe "-80pct"
    convert "$fichier" -quality "$taux" "${fichier/%.jpeg}-${taux}pct.jpeg" #le fichier doit rester un '.jpeg'
done

Dernière modification par Watael (Hier à 21:22)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#4 Aujourd'hui à 00:15

cristobal78

Re : Limiter l'actionde la Cde "convert" aux fichiers jpg d'un dossier

Merci à kamaris et watael.  smile

C'est la 1-ere fois que je vois cette instruction "continue"
Après avoir lu vos 2 post Je suis allé consulter le cours d'Eric Sanchis : il n'en parle pas. Puis celui de F. Lang qui l'evoque en une ligne et sans exemple de script.
Heureusement l'abs-guide  de Mendel Cooper détaille et donne des exemples !
Cela dit le bouquin de Cooper fait plus de 1000 pages et j'avoue que je nes ai pas toute lues.

@ watael
la fonction ne sert à rien si on boucle avec "for...do...done" mais est-ce aussi vrai quand on utilise, comme je l'ai fait, une boucle "while ...do ...done"   ?

Toujours pour watael :

convert "$fichier" -quality "$taux" "${fichier/%.jpeg}-${taux}pct.jpeg" #le fichier doit rester un '.jpeg'

J'ai toujours un peu de mal avec les { } au lieu des ( ) et j'ai constaté que

convert "$fichier" -quality "$taux"   "${fichier}-$(taux)pct"

fonctionne aussi très bien c'est à dire
sans / %, sans { } pour taux, et sans rajouter .jpeg

Il semble également que le paramètre -quality lève toute ambiguïté sur le mime type du fichier résultat.
Je me trompe ?

Dernière modification par cristobal78 (Aujourd'hui à 01:07)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#5 Aujourd'hui à 02:25

Watael

Re : Limiter l'actionde la Cde "convert" aux fichiers jpg d'un dossier

elle ne sert à rien, parce qu'à aucun moment le code de la fonction n'est réutilisé dans le script; c'est peut-être la principale raison d'être des fonctions : ne pas taper plusieurs fois le même code à différents endroits d'un script.
tu pourrais simplement mettre le if dans la boucle while (si tu tiens à itérer sur le nombre d'arguments du script, bien que ce ne soit pas ce qu'il y a de plus pratique), comme je l'ai fait dans le script que je donne en exemple.

J'ai toujours un peu de mal avec les { } au lieu des ( ) et j'ai constaté que

convert "$fichier" -quality "$taux"   "${fichier}-$(taux)pct"

fonctionne aussi très bien c'est à dire
sans / %, sans { } pour taux, et sans rajouter .jpeg

ça fonctionne*, mais pas de la même manière.
ton code donnera : /chemin/nomFichier.jpeg-80pct
alors, que celui que je montre donnera /chemin/nomFIchier-80pct.jpeg, c'est pour ça que je dis "le fichier doit rester un '.jpeg'" ("point jpeg", je ne parle pas du type, mais de l'extension), et pas un .jpeg-80pct

note aussi que le tiret ne peut pas entrer dans la composition du nom d'une variable; les Développements de paramètres qui le précède n'ont donc pas besoin d'être entre accolades.

--
* en fait, non, ça ne fonctionne pas (je n'avais pas lu d'assez près wink ). $(taux) est une Substitution de commandes et va donc vouloir interpréter taux comme une commande. Tu voulais écrire ${taux}, qui est un Développement de paramètres.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#6 Aujourd'hui à 18:46

cristobal78

Re : Limiter l'actionde la Cde "convert" aux fichiers jpg d'un dossier

salut watael

merci pour les explications concernant l'utilisation des () et des {}  smile
Curieusement ma ligne  - fautive - avec $(taux) que je remplace immédiatement sur tes conseils par ${taux} n'avait pas provoqué de réaction quand j'avais testé mon script avec shellcheck.

Pour finir  peux tu me dire ce qui est le mieux de for ... ou de while ... pour ce genre de script.
Le script a l'air plus simple avec for mais est-ce une raison suffisante !
Après ça je refait mon script en introduisan la ligne  "continue" découverte grace à kamaris et toi.  smile


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne