Outils pour utilisateurs

Outils du site


linux:scripts_bash:vrac

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
linux:scripts_bash:vrac [18/08/2006 19:46] – créée daniellinux:scripts_bash:vrac [22/07/2010 17:29] (Version actuelle) daniel
Ligne 1: Ligne 1:
 +====== Bout de scripts en vrac ======
 +
 +
 +===== dates =====
 +  * date => timestamp : ''date -d "2008-01-17 16:05:44 CET" "+%s"''
 +  * timestamp => date : ''date -d "1970-01-01 UTC +1200582344 seconds"'', que l'on peut formater avec par exemple ''date -d "1970-01-01 UTC +1200582344 seconds" "+%d/%m/%Y %H:%M:%S"''
 +
 +
 +===== lister fichiers avec md5, taille, etc =====
 +Pour faire un csv avec dossier;fichier;date;heure;taille;md5 :
 +<code bash>
 +rep=dossier_dans_lequel_chercher
 +csv=liste_fichiers.csv;
 +echo '"Dossier";"Fichier";md5sum;date;heure;taille' > $csv;
 +find "$rep" -type f|while read f;
 +do
 +  fich="$(basename "$f")";
 +  rep="$(dirname "$f")";
 +  md5=$(md5sum "$f"|cut -d " " -f 1);
 +  echo -n "\"$rep\";\"$fich\";$md5;">>$csv;
 +  ls -l "$f" | awk '{print $6";"$7";"$5}' >> $csv;
 +done;
 +</code>
 +
 +===== parsing de logs =====
 +
 +pour récupérer les hits de certaines heures certains jours (dans des logs apache)...
 +
 +  for j in $(seq -w 7 11); \
 +    do echo $j; jour="$j/Aug/2006"; \
 +    trace=recap_06-08-${j}_2sites.log; echo>$trace; \
 +    for f in $logs; do echo -e "\n$f">>$trace; \
 +      for h in $(seq 17 22); do echo -n "${h}h :">>$trace; \
 +        grep -c "$jour:$h" $f|sed '/:0$/d'>>$trace; \
 +      done; \
 +    done;\
 +  done;
 +
 +
 +
 +===== tags mp3 =====
 +Pour manipuler en masse des tags mp3, j'ai essayé pas mal de soft "graphique" sans grand succès (très long à tagger de nombreux fichiers). J'ai donc une ligne en shell pour extraire les infos, la manipulation des infos dans un tableur, puis la réécriture des infos en shell (expressions générées par le tableur).
 +
 +Récupérer les nom de fichier mp3:
 +  find /path/2/mp3 -name *.mp3|sed -e 's/^/"/; s/$/"/' > mp3.list
 +Récupérer les tags, et mettre tout ça dans un fichier texte avec | comme séparateur.
 +  echo "Titre|Artiste|Album|Année|Commentaire|piste n°|Genre">mp3-tags.csv; \
 +  while read ligne; do echo -n "$ligne" >> mp3-tags.csv; \
 +    id3ed -i "$ligne"|iconv -f ISO8859-1 -t UTF8|sed -e '1 d; s/^.*:/|/'|tr -d "\n">>mp3-tags.csv; \
 +    echo >>mp3-tags.csv; done<mp3.list
 +Pour comprendre la ligne principale :
 +  * tester id3ed -i fichier : affiche la liste des tags du fichier
 +  * iconv -f ISO8859-1 -t UTF8 : sert à mettre en utf8 la sortie de id3ed (si votre sytème de fichier n'est pas en utf8, donc on suppose des noms de fichiers en iso8859-1, c'est inutile).
 +  * sed -e '1 d; s/^.*:/|/' sert à virer ce qui précède le ":" sur chaque ligne et ajouter le "|" comme séparateur avec le champ précédent.
 +  * tr -d "\n" vire les retour chariot pour tout mettre sur une ligne.
 +  * le dernier echo sert à revenir à la ligne dans le fichier csv de sortie
 +
 +Ensuite, il reste à ouvrir le csv avec votre tableur (oocalc par exemple), modifier ce que vous voulez, ajouter dans une dernière colonne une formule du genre
 +  ="id3ed -q -s '"&B2&"' -n '"&C2&"' -a '"&D2&"' -y '"&E2&"' -c '"&F2&"' -k '"&G2&"' -g '"&H2&"' '"&A2&"'"
 +La syntaxe id3ed est en effet (''id3ed --help'')
 +  id3ed [-s songname] [-n artist] [-a album] [-y year] [-c comment] [-k tracknum] [-g genre] fichier
 +
 +
 +
 +===== Effacer des images orphelines =====
 +<code bash>
 +# dans un rep d'image d'un site qcq
 +# backup !
 +cp -a . ../img.bak
 +mkdir ../tmp
 +# les fichiers dans lesquels il faut fouiller
 +fichiers="../*.php ../inc/*.html ../inc/*.php ../*.css"
 +# on fouille
 +for img in *; do echo $img; >../tmp/$img.txt; for f in $fichiers; do grep -c $img $f >>../tmp/$img.txt; done;done;
 +# et on efface ce qui n'a renvoyé que des 0
 +for f in ../tmp/*.txt; do n=$(grep -v "^0$" $f|wc -l); [ $n -eq 0 ] && todel=$(basename $f .txt) && echo $todel && rm -f $todel; done;
 +# ensuite, si tout est OK, on peut effacer img.bak et tmp
 +</code>
 +
 +
 +===== Colorer la sortie d'un script =====
 +Pour afficher [OK] en vert et [KO] en rouge en fonction du bon déroulement d'une commande (cf une [[ http://www.trustonme.net/didactels/132.html#path_schell|liste de code couleur bash]], avec les raccourcis )
 +<code>
 +OK='[ \e[0;47m\e[0;32mOK\e[0;00m ]'
 +KO='[ \e[0;47m\e[0;31mKO\e[0;00m ]'
 +commande && echo -e $OK || echo -e $KO
 +</code>
 +
 +
 +
 +
 +===== Récupérer les journaux de france culture =====
 +D'après leur podcast
 +<code bash>
 +[ $# -ne 1 ] && echo "Il faut passer un argument (7,12,18,22) pour le journal choisi)" && exit 1
 +
 +urls=([7]=http://radiofrance-podcast.net/podcast09/rss_10055.xml [12]=http://radiofrance-podcast.net/podcast09/rss_10059.xml [18]=http://radiofrance-podcast.net/podcast09/rss_10060.xml [22]=http://radiofran
 +url=''
 +for i in ${!urls[*]}
 +do
 +  [ $1 -eq $i ] && url=${urls[i]} && h=$i
 +done
 +[ -z "$url" ] && echo "Vous devez donner un journal existant (7, 12, 18 ou 22)" && exit 1
 +
 +wget $url -O fc${h}.xml
 +mp3=$(sed -nre '
 +{
 +  :boucle
 +  N
 +  $! b boucle
 +}
 +s#.*http://([^<]*)</guid>.*#http://\1#p' < fc${h}.xml)
 +
 +echo -e "\nOn va essayer de récupérer \e[0;47m\e[0;32m$mp3\e[0;00m\n"
 +wget "$mp3" -O fc${h}.mp3 && rm -f fc${h}.xml
 +</code>
 +
 +Et avec zenity (à peaufiner...)
 +<code bash>
 +#!/bin/bash
 +
 +# les urls des rss, à modifier si ça devait changer...
 +urls=([7]=http://radiofrance-podcast.net/podcast09/rss_10055.xml [12]=http://radiofrance-podcast.net/podcast09/rss_10059.xml [18]=http://radiofrance-podcast.net/podcast09/rss_10060.xml [22]=http://radiofrance-podcast.net/podcast09/rss_10061.xml)
 +
 +# qq tests
 +which zenity >/dev/null
 +# Attention avec $?, 0 => OK, on change
 +[ $? -eq 0 ] && zenok=TRUE || zenok=FALSE 
 +
 +which notify-send >/dev/null
 +[ $? -eq 0 ] && notifok=TRUE || notifok=FALSE
 +# faudrait plutôt se baser sur le test [ -z "$TERM" ]
 + 
 +
 +# les fonctions
 +
 +get_heure() {
 +  if [ $# -eq 0 ] && [ "$zenok" = "TRUE" ]
 +  then
 +    ret=$(zenity --title='Lequel ?' --text="Attention, pas de barre de progression,\nça télécharge puis s'ouvrira tout seul" --height=250 --list --radiolist \
 +      --column='' --column='Journal de' \
 +      'FALSE' 7h \
 +      'TRUE' 12h30 \
 +      'FALSE' 18h \
 +      'FALSE' 22h)
 +    [ -z "$ret" ] && exit 0 # clic sur annuler
 +    case "$ret" in
 +      7h)     h=7;;
 +      12h30) h=12;;
 +      18h)   h=18;;
 +      22h)   h=22;;
 +      *) set_msg "Heure $ret inconnue" && exit 1;;
 +    esac
 +  else
 +    [ $# -ne 1 ] && echo "Il faut passer un argument (7,12,18,22) pour le journal choisi)" && exit 1
 +    h=$1
 +  fi
 +  return $h
 +}
 + 
 +set_msg() {
 +  [ $notifok = "TRUE" ] && notify-send -t 1000 $1 || echo $1
 +}    
 + 
 +check_heure() {
 +  url=''
 +  for i in ${!urls[*]}
 +  do
 +    [ $1 -eq $i ] && url=${urls[i]} && h=$i
 +  done
 +  [ -z "$url" ] && set_msg "Vous devez donner un journal existant (7, 12, 18 ou 22)" && exit 1
 +}
 + 
 +ask2continue() {
 +  if [ $zenok = TRUE ]
 +  then
 +     zenity --question --text="$1"
 +     [ $? != "0" ] && exit 0
 +  else
 +    echo $1
 +    echo "Continuer ? (o/n)"
 +    read rep
 +    [ "$rep" != 'o' ] && echo "Abandon" && exit 0
 +  fi
 +}
 + 
 +get_url() {
 +  xml="/tmp/fc${h}.xml"
 +  wget $url -O "$xml"
 +  mp3=$(sed -nre '
 +    {
 +      :boucle
 +      N
 +      $! b boucle
 +    }
 +    s#.*http://([^<]*)</guid>.*#http://\1#p' < $xml)
 + 
 +  jour=$(date '+%d.%m.%Y')
 +  [ "$(echo $mp3|grep -c $jour)" != '1' ] && ask2continue "Apparemment ce n'est pas le journal du jour : $mp3\nOn continue quand même ?"
 + 
 +  # si abandon on est déjà sorti
 +  fich=/tmp/fc${h}.mp3
 +  wget "$mp3" -O $fich
 +  if [ $? ]
 +  then
 +    rm -f fc${h}.xml
 +    set_msg "On a récupéré un mp3 ($fich)"
 +    xdg-open $fich
 +#    rm -f $fich # xdg rend la main tout de suite
 +  fi
 +}
 + 
 +# et le main
 +get_heure $*
 +h=$?
 +check_heure $h
 +get_url $url
 +</code>