Petits scripts

Voici mes petits scripts, souvent fait moi-même. Rien d'extraordinaire mais certains sont bien pratiques. Je les met en ligne pour moi-même, mais au cas où l'envie vous prend de les réutiliser, servez-vous !

Notez que ces scripts sont brutes : ils marchent suffisamment bien pour moi, mais ils méritent à être améliorés pour certaines applications. Dans tous les cas, faites quand-même attention.

Voici un site avec plein de scripts : www.bashscripts.info.

Optipng (v1)

Comme je prête une certaine importance à l'optimisation de la vitesse d'affichage des pages de mon site, et plus particulièrement des images, j'utilise souvent Optipng. Je me suis inspiré de cette page et j'ai pondu ça :

#!/bin/bash
gnome-terminal -x bash -c 'optipng *.png && echo --- D0NE --- ; read'

En lançant ce script, ça optimise tous les fichiers PNG du dossier avec optipng. Ma touche perso étant d'ouvrir un terminal (pour suivre le déroulement des opérations) et surtout de le laisser ouvert et d'afficher "DONE" quand le script a fini de s'exécuter

sommaire

Optipng (v2)

Dans la même veine que le code précédent, voici un script qui optimise toutes les images d’un dossier (png mais aussi jpeg, en destructif et non destructif) :

#!/bin/bash

# Required commands :
# - optipng
# - pngnq
# - jpegoptim
# - rename
# - imagemagick

# imagemagick (removes Alpha : is destructive)
mogrify -alpha remove -background white *.png

# pngnq (is destructive)
pngnq -vf -s1 *.png
rename -f 's/-nq8.png$/.png/' *.png

# optipng (non destructive)
optipng *.png

# reduce JPG quality to 70% (destructive)
jpegoptim --max=70 *.jpg

# optimize JPG (non-destructive)
jpegoptim *.jpg

sommaire

Renommer des fichiers à partir d'une liste

Si j'ai un dossier avec des fichiers nommés "01.mp3", "02.mp3", "03.mp3", etc. et que j'ai un fichier texte contenant des noms plus précis, ce script permet de renommer tous les fichiers par le noms dans le fichier texte. Par exemple, plus besoin de renommer à la main les 20 pistes d'une CD que vous venez de ripper, si vous avez les noms des pistes dans un dossier !
Attention : si votre fichier texte est mal fait (pas assez de noms pour chaque fichier par exemple) il se peut que certains fichiers soient supprimés. Faites une sauvegarde du dossier avant d'appliquer le script, c'est plus sûr.
Les fichiers sont renommés dans l'ordre d'apparition dans le dossier et en lisant ligne par ligne dans le fichier des noms

#!/bin/bash

no_ligne=0
while read line
   do
      tableau[no_ligne]="$line"
      let no_ligne=no_ligne+1
   done < noms_de_fichiers.txt
cd dossier_de_fichiers;

p=0
for no_file in *.mp3
   do
      mv $no_file "${tableau[p]}.mp3"
      let p=p+1
   done

sommaire

Changer de fond d'écran à intervalle régulier

Ce script marche sous Gnome (dépend de Gconf-editor). Il change juste la clé correspondant à l'image de fond dans les fichiers Gconf, toutes les demi-heures.

#!/bin/bash

dossierimages="$HOME/Images/wallpaper/" # chemin du dossier des images
images_dispo=`ls $dossierimages`

for image_courant in $images_dispo
   do
   gconftool-2 --set /desktop/gnome/background/picture_filename --type string "$dossierimages$image_courant"

   sleep 1800 # durée en seconde
done

sommaire

Scrapbook : faire une liste des pages enregistrés

Scrapbook est une extension de Firefox qui permet d'enregistrer/annoter des pages web. L'extension n'est disponible que sous Firefox, mais les pages sont au format HTML, donc parfaitement lisibles dans les autres navigateurs.

Ce script crée une page HTML avec la liste des pages scrapbookés. À chaque fois un lien vers la page enregistré est donné, ainsi qu'un lien vers la page en ligne.

Avant d'exécuter le script, il faut se trouver dans le dossier "data" de scrapbook.

#!/bin/bash

outfile=$HOME/Bureau/log.html

echo '<!DOCTYPE html>
<head>
   <meta charset="UTF-8">
   <title>Mes pages Scrapbookés</title>
   <style type="text/css">
   #list li img { width:16px; height:16px; margin-right: 5px; }
   #list li a { line-height:18px; vertical-align:middle; }
   #list li a { color:gray; text-decoration:none; }
   #list li a:hover { color:black; text-decoration:underline; }
   </style>
</head>
<body>
<ul id="list">' > $outfile

# on liste les pages scrapbookés
i=0
for subfol in $(find $PWD -type d -maxdepth 1 -mindepth 1)
   do 
      listefld[$i]=$subfol
      ((i++))
   done

# on recherche via grep le lien et le titre des pages.
for i in "${listefld[@]}"
   do
      echo "<li><a href=\"$i/index.html\"> <img src=\"$i/favicon.ico\" />
      `grep "^title" "$i/index.dat" | cut -c 7- `</a> - 
      <a href=\"`grep "^source" "$i/index.dat" | cut -c 8- ` \"> (voir en ligne)</a></li>" >> $outfile
   done

echo -e "</ul>\n</body>\n</html>" >> $outfile

sommaire

Scour

Le script Scour n'est pas de moi : il permet de nettoyer les fichiers SVG, un peu comme Optipng nettoie les fichiers png. Le problème, c'est que scour conserve le fichier source et crée un fichier de destination.

Ce script supprime le fichier source s'il est optimisé et le remplace par le fichier destination.

#!/bin/bash
i=0
j=0
# On liste les fichiers SVG dans un tableau :
for file in $(find $PWD -type f -name "*.svg")
do 
	listefile[$i]=$file
	((i++))
done

# On applique scour sur chaque entrée du tableau :
for i in "${listefile[@]}"
do
	python ~/.scour/scour.py -i $i -o $i.cc
	val=`grep "svg" $i.cc`
	# si scour appliqué correctement, ne garde que le fichier optimisé
	if [ -n "$val" ]
		then
			echo "$i OK"
			mv $i.cc $i
		else
			echo "$i NON OK"
			rm $i.cc
	fi
	((j++))
	echo $j

done

Une nouvelle fois, c'est un script suffisamment bon pour moi, mais qui peut largement être amélioré.

sommaire

Inverser des variables en C

D'habitude on est obligé d'utiliser une troisième variable, temporaire. Ici, non grâce à une jonglerie mathématique simple :

#include <stdio.h>

void main ()
{
	int a = 2, b = 5;

	printf("Avant : a=%d, b=%d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;

	printf("Apres : a=%d, b=%d\n", a, b);
	return 0;
}

Cependant, comme le fait remarquer un lecteur, David, utiliser cette méthode peut aboutir à un dépassement de la mémoire lors de l’opération a=a+b, car le type int de a est limité.

Source, sur CCM qui utilise une méthode avec des pointeurs.

Meewan, un lecteur, me donne également cette variante, qui devrait fonctionner pour tous les types de variables (pas juste des int) :

#include <stdio.h>

void main ()
{
	int a = 2, b = 5;

	printf("Avant : a=%d, b=%d\n", a, b);
	a ^= b;
	b ^= a;
	a ^= b;
	printf("Apres : a=%d, b=%d\n", a, b);
	return 0;
}

L’astuce fonctionne grâce à l’opérateur « XOR » (le ^), qui fonctionne au niveau binaire des variables.

sommaire

Tuer un processus dés qu'il dépasse un seuil de mémoire

Ce script affiche un popup (pour GTK+/GNOME) dés qu'un processus (déclaré par NAME) dépasse un seuil de mémoire (MEM_LIM).
Vous avez alors la possibilité de le tuer où d'attendre 30secondes.

Ici, l'avertissement sera rappelé toutes les 30 secondes, c'est le « sleep 30 » en bas.

#!/bin/bash

# Process name to check out
NAME=firefox
# Memory limit, in Ko
MEM_LIM=500000

while [ 1 = 1 ]
do
   PROCESS=$(pgrep -c $NAME); # count processes
   [[ ${PROCESS} -ne 0 ]] && {

      # get mem (in KB) of process 'NAME'
      VALMEM=`ps -e orss,comm | grep $NAME | cut -d ' ' -f 1`

      if [ $VALMEM -gt $MEM_LIM ]
      then
         zenity --question --text "$NAME reaches $VALMEM KB" --ok-label "Kill $NAME" --cancel-label "Remember later"
         RETOUR="$?"; # annuler = 1   ;   valider = 0
            if [ $RETOUR = 0 ]
            then
               kill -9 `pgrep $NAME`;
               zenity --info --text "$NAME successfully killed"
               exit 0
            fi
      fi
   }
   sleep 30
done
exit 0

sommaire

Redimensionner facilement des images à la volée

Ce script affiche un popup (pour GNOME) avec un curseur demandant une valeur entre 5 et 100. Le nombre choisis sera le pourcentage de redimensionnement des images du dossier courant.

#!/bin/bash
RETOUR=`zenity --scale --text "Pourcetage de réduction :" --value=50 --min-value=5 --max-value=100 --step=1`;

for i in *.JPG
do
	convert "$i" -resize $RETOUR% "$i";
done

notify-send --icon="info" "Images rétrécies";

Ici, une version améliorée, où il demande un pourcentage de réduction de la taille puis la qualité de l’image JPG. Plus la qualité est basse, plus la taille du fichier est optimisée. Pour les photos, il n’est en général pas nécessaire d’aller au dessus de 80%, la qualité visuelle n’est pas meilleure mais le poids du fichier est beaucoup plus grand quand même (voir ici pour plus de détails sur la compression des images).

#!/bin/bash
SIZE=`zenity --scale --text "Pourcetage de réduction :" --value=50 --min-value=5 --max-value=100 --step=1`
QUALITY=`zenity --scale --text "Pourcentage de conpression JPEG :" --value=85 --min-value=5 --max-value=100 --step=1`

for i in *.JPG
do
	convert "$i" -quality $QUALITY -resize $SIZE% "$i";
done

notify-send --icon="info" "Toutes les conversion sont terminée !" ":-)";

sommaire

Convertir des vidéos en MP3 à la volée

Ce script récupère le son de tous les fichiers vidéo d’un dossier. Il produit du MP3 à 160 kbps (si les vidéos viennent de youtube, inutile de faire plus haut).

À chaque fichier converti, un fichier MP3 est créé, et un message OSD est produit. Les paquets avconv, notify-send et les codecs doivent être installés sur le système.

#!/bin/bash

for i in *;
	do avconv -i "$i" -c:a libmp3lame -ab 160k "$i.mp3";
	notify-send --icon="info" "Conversion terminée" "$i" --expire-time=2000;
done
notify-send --icon="info" "Toutes les conversion sont terminée !" ":-)";

sommaire

Renommer les fichiers de façon aléatoire

Ce script renome tous les fichiers JPG du dossier avec des noms aléatoires.

#!/bin/bash
for i in *.jpg
do
	mv $i $(uuidgen | cut -d '-' -f 1).jpg;
done

sommaire

Page créée en juillet 2010, mis à jour le mardi 11 novembre 2014.
Adresse de la page : http://lehollandaisvolant.net/linux/scripts/