Petit florilège de commandes utiles
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
- Comparer la sortie de deux commandes
- Comparer ligne à ligne deux fichiers
- Créer un gif d’une suite d’images avec ffmpeg
- Mettre en pause et relancer un processus
- Ajouter de nouvelles polices de caractères au système
- Générer des images dans un terminal graphique
- Découper automatiquement un fichier audio
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.
Pour afficher des bannières ASCII, on peut aussi utiliser figlet
.
$ figlet toto
_ _
| |_ ___ | |_ ___
| __/ _ \| __/ _ \
| || (_) | || (_) |
\__\___/ \__\___/
Pour aller plus loin :
- la page officielle de chafa
- la page officielle de figlet
- le standard ANSI X3.64 listant les séquences d’échappement pour les terminaux graphique
- un site permettant de générer des bannières ASCII
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épartst=1
(en seconde) et pour une durée ded=5
(en secondes)