Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
details.sh (4185B)
1 #! page 2 title: Des détails 3 author: Arthur Pons 4 description: Plus de détails sur comment construire et gérer une playlist pour le nouvel an avec des outils simples et sobres 5 publication: 2023-11-15 6 sectionmd: main 7 8 9 ## t2s2t 10 11 C'est super nul comme nom. Sinon voici le code : 12 13 #! /bin/sh 14 15 if [ ! "$1" = "-r" ] 16 then 17 sed 's/:/*3600+/;s/:/*60+/' | bc -l 18 else 19 xargs printf 'tot=%s; 20 hours=tot/3600; 21 minutes=(tot-3600*hours)/60; 22 seconds=tot-3600*hours-60*minutes; 23 print hours,":",minutes,":",seconds,"\n"; 24 \n' | 25 bc | 26 sed -E 's/^[0-9]:/0&/; 27 s/:([0-9]):/:0\1:/; 28 s/:([0-9])$/:0\1/' 29 fi 30 31 En gros si le script est utilisé dans le sens `hh:mm:ss -> ssss` alors on 32 remplace simplement le premier `:` par `*3600+` et le second par `*60+`. Ainsi 33 pour 01:23:55 on obtient l'expression mathématique `01*3600+23*60+55` que l'on 34 donne à `bc` et hop le tour est joué. 35 36 Si le script est utilisé dans l'autre sens le problème est un peu plus 37 compliqué. Les commandes `bc` (après le `printf`) fonctionnent parce 38 qu'appeler `bc` sans l'option `-l` empêche les opérations sur des flottants et 39 arrondi donc tout à l'entier inférieur. Ainsi `3654/3600` donne `1`, c'est à 40 dire le nombre d'heures dans 3654 secondes. On soustrait ensuite le nombre 41 d'heures complètes au total pour le diviser par 60 pour avoir le nombre de 42 minutes complètes au delà du nombre d'heures complètes. `(3654-3600*1)/60` 43 donne `54/60` qui donne `0` puis de même avec les secondes qui ici va donner 44 `54`. Finalement on affiche les trois variables séparées avec des `:`. Afin de 45 pouvoir manger une potentielle longue liste de valeur on utilise `xargs` et 46 `printf`. 47 48 Admettons que l'on a la liste suivante : 49 50 seq 200 205 51 52 200 53 201 54 202 55 203 56 204 57 205 58 59 Notre commande xargs va générer la commande printf suivante : 60 printf 'tot=%s; 61 hours=tot/3600; 62 minutes=(tot-3600*hours)/60; 63 seconds=tot-3600*hours-60*minutes; 64 print hours,":",minutes,":",seconds,"\n";' 200 201 202 203 204 205 65 66 Qui déroulée va donner 67 68 tot=200; 69 hours=tot/3600; 70 minutes=(tot-3600*hours)/60; 71 seconds=tot-3600*hours-60*minutes; 72 print hours,":",minutes,":",seconds,"\n"; 73 74 puis pareil avec `201` etc. On met tout dans `bc` puis on passe un coup de 75 `sed` pour ajouter des `0` quand il en manque. 76 77 ## cumulduration 78 79 Le code est celui-ci : 80 81 #! /bin/sh 82 83 tot=0 84 for duration in $(cat) 85 do 86 tot=$(( tot + $duration )) 87 echo $tot 88 done 89 90 On boucle sur chaque ligne dans STDIN. Pour chacune d'entre elle on ajoute la 91 valeur lue au total et on affiche sa valeur courante. Simple efficace. 92 93 ## predict 94 95 Le code : 96 97 #!/bin/sh 98 99 echo "0\n$(cat)" | 100 xargs printf "$(date -Iseconds --date "$1")+%sseconds\n" | 101 date -f - +"%X" 102 103 On ajoute un `0` en début de flux sinon le résultat nous dira que la première 104 chanson se lance après sa propre durée. Il faut donc lui faire croire qu'il 105 existe une première de durée nulle. On construit une commande `printf` avec en 106 argument toutes les durées en seconde de façon à construire tous les formats de 107 date. Notez le `$1` qui permet de passer le date de début en argument à predict. 108 Par exemple pour une date de début au 31 décembre à 19h : 109 110 seq 200 210 | 111 xargs printf "$(date -Iseconds --date "dec 31 19:00")+%sseconds\n" 112 113 Lancera la commande 114 115 printf "2023-12-31T19:00:00+01:00+%sseconds\n" 200 201 202 203 204 205 206 207 208 209 210 116 117 qui donne : 118 119 2023-12-31T19:00:00+01:00+200seconds 120 2023-12-31T19:00:00+01:00+201seconds 121 2023-12-31T19:00:00+01:00+202seconds 122 2023-12-31T19:00:00+01:00+203seconds 123 2023-12-31T19:00:00+01:00+204seconds 124 2023-12-31T19:00:00+01:00+205seconds 125 2023-12-31T19:00:00+01:00+206seconds 126 2023-12-31T19:00:00+01:00+207seconds 127 2023-12-31T19:00:00+01:00+208seconds 128 2023-12-31T19:00:00+01:00+209seconds 129 2023-12-31T19:00:00+01:00+210seconds 130 131 formats qui mangés par `date` en demandant de n'afficher que l'heure donnent : 132 133 printf "2023-12-31T19:00:00+01:00+%sseconds\n" 200 201 202 203 204 205 206 207 208 209 210 | 134 date -f - +"%X" 135 136 19:03:20 137 19:03:21 138 19:03:22 139 19:03:23 140 19:03:24 141 19:03:25 142 19:03:26 143 19:03:27 144 19:03:28 145 19:03:29 146 19:03:30 147 148 En tout 24 lignes de code.