Exile on Keyboard St.

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 25 septembre 2016

Linux: Réduire la qualité d'une image .jpg en ligne de commande

Les photos prises avec les téléphones portables modernes ou les appareils photos numériques ont un poids en Mo de plus en plus élevé.

Pourtant, on a souvent besoin d'envoyer à quelqu'un une photo pour information, c'est à dire que la qualité de la photo importe peu dans notre démarche. Dans ce cas, c'est plus sympa que la photo pèse 250Ko plutôt que 5Mo !

Le paquet imagemagick sous Linux propose plusieurs lignes de commande pour traiter les images.

Par exemple, avec la commande mogrify je peux réduire le poids, c'est à dire la place occupée sur le disque, d'une image prise avec mon téléphone comme ceci:

mogrify -quality 50 Téléchargements/IMG_20160923_090158547.jpg

Attention: Par défaut, la commande mogrify modifie le fichier initial et n'en fait pas de copie. Pour définir un répertoire de sortie, on peut utiliser l'option -path output_path de mogrify.

On peut aussi utiliser la commande convert comme suit:

convert -quality 50 Téléchargements/IMG_20160923_090158547.jpg Téléchargements/IMG_20160923_090158547-new.jpg

Les commandes mogrify et convert acceptent évidemment beaucoup d'autres options décrites dans leurs manpages respectives.

vendredi 9 septembre 2016

Shell: Boucler sur une liste de valeurs

On va s'intéresser aujourd'hui à la boucle en Shell pour parcourir une liste de valeurs.

Imaginons un outil en ligne de commande qui permette de contrôler un démon ou un processus serveur. Cet outil devra être capable de gérer les commandes suivantes:

  • start
  • stop
  • status
  • restart

Pour afficher l'aide de l'outil, on va donc parcourir les commandes possibles et notre ébauche de code ressemblera à:

for command in start stop status restart; do
    echo "$command: ..."
done

qui pour l'instant affichera:

start: ...
stop: ...
status: ...
restart: ...

Comme la liste des commandes possibles est codé en dur dans le code, on va améliorer le code comme ceci:

commands="start stop status restart"
for command in $commands; do
    echo "$command: ..."
done

A l’exécution, le résultat est le même: on passe bien 4 fois dans la boucle.

Si maintenant je modifie légèrement le code en:

...
for command in "$commands"; do
    echo "$command: ..."
done

J'obtiens le résultat (surprenant ?) suivant:

start stop status restart: ...

On ne passe plus qu'une fois dans la boucle !!!

En effet, le fait de "quoter" la référence à la variable commands désactive la séparation des mots (word splitting) et la boucle ne voit qu'une commande !

Cela revient à faire:

for command in "start stop status restart"; do
    echo "$command: ..."
done

Ce qui n'est pas ce que l'on veut.

L'utilisation d'un outil de vérification de Scripts Shell comme ShellCheck nous aurait d’ailleurs signalé l'erreur:

for command in "$commands"; do
               ^-- SC2066: Since you double quoted this, it will not word split, and the loop will only run once.

dimanche 4 septembre 2016

Linux: Le NetworkManager en commande ligne !

Quand on utilise Gnome, les interfaces réseau sont configurées de manière graphique via l'Applet NetworkManager et donc on n'utilise pas la ligne de commande.

Il existe pourtant une commande ligne nmcli dans le paquet network-manager.

nmcli help
Utilisation : nmcli [OPTIONS] OBJET { COMMANDE | help }

OPTIONS
  -t[erse]                                   sortie laconique
  -p[retty]                                  sortie formatée
  -m[ode] tabular|multiline                  mode de sortie
  -f[ields] <field1,field2,...>|all|common   spécifie les champs à afficher
  -e[scape] yes|no                           échapper les séparateurs de colonnes dans les valeurs
  -n[ocheck]                                 ne pas vérifier les versions de nmcli et NetworkManager
  -v[ersion]                                 afficher la version du programme
  -h[elp]                                    afficher l'aide

OBJET
  nm          état de NetworkManager
  con         connexions de NetworkManager
  dev         périphériques gérés par NetworkManager

Par exemple, pour déconnecter la connexion de l'interface eth0, on utilisera:

nmcli dev disconnect iface eth0

Pour se reconnecter, il nous faut le UUID de la connexion en question:

 nmcli con list
NOM                       UUID                                   TYPE              TIMESTAMP-REAL                    
freebox_ICPPKY            c6fe6f31-fe56-406d-9cd1-936aafb8caf6   802-11-wireless   lun. 09 mai 2016 07:48:07 CEST    
freebox_cpl               fcd1ad91-2041-4804-826d-0f7ce9dc7090   802-3-ethernet    dim. 04 sept. 2016 07:45:23 CEST  

Comme je n'utilise plus le Wi-FI, la commande de reconnexion sera donc:

nmcli con up uuid fcd1ad91-2041-4804-826d-0f7ce9dc7090

Voilà ! Vous savez couper et remettre le réseau en ligne de commande.

Note: N'hésitez pas à consulter l'aide de la commande nmcli de la distribution Linux que vous utilisez car apparemment la syntaxe de nmcli change quelque peu d'un Linux à l'autre.

- page 1 de 33