Ceci est un billet rapide pour lister les commandes utiles sous Linux. Je l’enrichirai au fur et à mesure…

Lister l’ensemble des fichiers d’une archive tar.gz

$ gunzip -c archive.tar.gz | tar -tvf -
  • L’option -c de gunzip affiche le contenu de l’archive sur la sortie standard.
  • L’option -t de tar liste le contenu de archive.tar (équivalent à --list)
  • L’otpion -v de tar passe en mode verbeux, comme bien souvent
  • L’option -f de tar indique que le fichier à extraire est passé en argument
  • Enfin le - à la fin de la commande indique à tar que le fichier n’est pas en argument mais provient de l’entrée standard

Comparer la sortie de deux commandes

Une petite subtilité de bash que j’ai découverte récemment (merci Célestin Matte et son article paru dans GNU/Linux Pratique n°124) : il est possible de traiter le retour d’une commande en tant que fichier avec la syntaxe <(commande).

Par exemple, j’ai deux scripts python et je souhaite comparer leur sortie. Il me suffit de faire :

$ diff <(python script_1.py) <(python script_2.py)

Comparer ligne à ligne deux fichiers

L’option -y de diff est bien pratique quand on veut comparer rapidement deux fichiers côte à côte.

$ diff -y file_1 file_2

Créer un gif d’une suite d’images avec ffmpeg

Il faut commencer par créer une palette sinon le gif n’aura pas les bonnes couleurs !

$ ffmpeg -i "Image_%02d.png" -vf palettegen palette.png
$ ffmpeg -i 'Image_%02d.png' -i palette.png  -lavfi paletteuse output.gif

Mettre en pause et relancer un processus

Il m’est déjà arrivé de lancer un gros code scientifique (en Matlab) et souhaiter le “mettre en pause” afin de dégager rapidement du temps processeur pour exécuter une autre tâche plus courte. Cela se fait très bien avec la commande kill et aux jobs bash. Exemple ci-dessous.

$ matlab &
$ jobs # Liste les processus qui tournent en arrière-plan du shell actif
[1]+  En cours d'exécution   matlab &  (wd : /home/donut)
$ kill -s SIGSTOP %1 # SIGSTOP : pause d'un processus. Le %1 désigne le 1er job (tel que listé par la commande jobs)
$ jobs # On vérifie que le job est bien suspendu
[1]+  Stoppé                 matlab
$ kill -s SIGCONT %1 # SIGCONT : reprise du processus
$ jobs # On vérifie que le job a bien repris
[1]+  En cours d'exécution   matlab &  (wd : /home/donut)

Ajouter de nouvelles polices de caractères au système

Récupérer les fichiers ttf (True Type Fonts), par exemple la police d’écriture de Diablo et les installer soit dans /usr/local/share/fonts (répertoire par défaut du système) soit dans ~/.local/share/fonts ou ~/.fonts (pour une installation par utilisateur).

il suffit ensuite d’utiliser la commande fc-cache pour mettre à jour le cache des polices

$ fc-cache -v

On peut ensuite vérifier que notre nouvelle police est bien détectée par le système

$ fc-list | grep -i diablo
/home/donut/.local/share/fonts/DIABLO_L.TTF: Diablo:style=Light
/home/donut/.local/share/fonts/DIABLO_H.TTF: Diablo:style=Heavy

Cette police apparaîtra ensuite dans toutes les applications utilisant des caractères (Libre Office, Gimp etc…). Pour plus d’informations, se référer au wiki de debian.org

Générer des images dans un terminal graphique

chafa est un petit utilitaire sympatique en ligne de commande qui permet de transformer une image en caractères imprimables sur un terminal virtuel.

Une image avant traitement par chafa

Sortie générée par chafa

Pour afficher des bannières ASCII, on peut aussi utiliser figlet.

$ figlet toto
 _        _        
| |_ ___ | |_ ___  
| __/ _ \| __/ _ \ 
| || (_) | || (_) |
 \__\___/ \__\___/ 

Pour aller plus loin :

Découper automatiquement un fichier audio

Ici je résume un peu quelques options sympa de youtube-dl, bash et ffmpeg.

Commençons par extraire la piste audio d’une vidéo youtube :

$ youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=X2WNHGnkfcA
  • L’option -x indique de n’extraire que la piste audio
  • L’option --audio-format mp3 indique de la sauvegarder au format mp3 (quitte à la convertir à l’aide de ffmpeg).

Le script bash ensuite qui vient découper la vidéo en fonction des timestamps indiqués dans la description de la vidéo. Ici on manipule des tableaux (chose que je fais si rarement en bash, que j’oublie toujours la syntaxe). On remarque les retours à la ligne pour scinder le code, à l’aide de \\n (attention, pas d’espace entre \ et \n, sinon ça ne marche pas !

#! /bin/bash

#Tracklist:
#------------
#00 - Intro - 0:00:00
#01 - By the Fireplace - 0:01:37
#01a - Chapter Title - 0:03:16
#01b - Melee Island Map - 0:03:28
#01c - Captain LeChuck - 0:05:49
#01d - Monkey Island Map - 0:07:25
#02 - The SCUMM Bar - 0:09:16
#03 - Fortune Teller's - 0:10:44
#04 - Mangy Bride - 0:12:39
#05 - Searching for Treasure - 0:14:32
#06 - Fettucini Brothers - 0:16:48
#07 - Guybrush Meets Elaine - 0:19:14
#08 - The Journey to Monkey Island - 0:21:43
#09 - Shaky-Ghostly Tune - 0:22:55
# "Fin du morceau : 00:24:21.05


t=("0:00:00" "0:01:37" "0:03:16" "0:03:28" "0:05:49" "0:07:25" "0:09:16" "0:10:44" "0:12:39" "0:14:32" "0:16:48" "0:19:14" "0:21:43" "0:22:55" "00:24:22") # 15 élements
name=(	"01_intro.mp3" "02_by_the_fireplace.mp3" "02a_chapter_title.mp3" "02b_Melee_island_map.mp3" "02c_captain_Lechuck.mp3" "02d_Monkey_island_map.mp3" \
	"03_the_Scumm_bar.mp3" "04_fortune_teller.mp3" "05_mangy_bride.mp3" "06_searching_for_treasure.mp3" "07_Fettucini_brothers.mp3" "08_Guybrush_meets_Elaine.mp3" \
	"09_the_journey_to_Monkey_island.mp3" "10_shaky-ghostly_tune.mp3") # 14 élements


N=$((${#t[@]}-2))

for k in $(seq 0 $N); do
	t1=${t[$k]}
	t2=${t[$((k+1))]}
	
	dt=$((   $(date --date $t2 +%s) - $(date --date $t1 +%s) ))
	f=${name[$k]}
	
	echo "- segment $((k+1))/$((N+1)) : from $t1 to $t2, duration $dt seconds >> $f"
	ffmpeg -i in.mp3 -ss $t1 -t $dt -c:a copy ${name[$k]} 
done

Après je redécoupe un peu les morceaux que je souhaite garder, quitte à ajouter un fade-in audio au début si la transition est trop brutale (attention, dans ce cas, le -ss doit venir avant le -i sinon les réferences temporelles du fade-in sont incorrectes) :

ffmpeg -ss 00:23.5 -i 01_intro.mp3 -af "afade=t=in:st=0:d=5" mi_ringtone_01.mp3
ffmpeg -i 03_the_Scumm_bar.mp3 -ss 00:02 -c:a copy mi_ringtone_02.mp3
ffmpeg -i 07_Fettucini_brothers.mp3 -ss 00:02 -c:a copy mi_ringtone_03.mp3
ffmpeg -i 02c_captain_Lechuck.mp3 -ss 00:02 -c:a copy mi_ringtone_04.mp3
  • L’option -ss 01:02:03 indique de ne commencer l’extraction qu’à partir du timestamp 1 heure 02 minutes et 03 secondes
  • L’option -t 00:12:34 indique de n’extraire que 12 minutes et 34 secondes par rapport au temps de départ indiqué par -ss
  • L’option -af "afade=t=in:st=1:d=5" introduit un fade-in à l’instant de départ st=1 (en seconde) et pour une durée de d=5 (en secondes)