Juin 142011
 

ajouter DISTINCT dans une requête mysql permet d’éliminer les doublons et donc d’avoir une liste des éléments simplifiée.

mais voilà, quand il y a plusieurs colonnes ça se complique, exemple:

mysql> SELECT DISTINCT obj_1_norm,obj_2_norm,obj_1_diam,obj_2_diam FROM FF_XII_tresors ;
 +----------------------+----------------------+----------------------+----------------------+
 | obj_1_norm           | obj_2_norm           | obj_1_diam           | obj_2_diam           |
 +----------------------+----------------------+----------------------+----------------------+
 | potion               | super-potion         | bloc de rouille      | ether                | 
 | potion               | collyre              | bloc de rouille      | ether                | 
 | potion               | potion               | bloc de rouille      | ether                | 
 | potion               | super-potion         | bloc de rouille      | super-potion         | 
 | potion               | antidote             | bloc de rouille      | super-potion         |
 {..snip..}
 +----------------------+----------------------+----------------------+----------------------+
 618 rows IN SET (0.01 sec)

Continue reading »

Juin 142011
 

la fonction suivante prend un nom de répertoire en argument et retourne un array contenant la liste de tous les fichiers récursivement:

Download : getFiles.sh

function getFiles($directory) {
    // Try to open the directory
    if($dir = opendir($directory)) {
        // Create an array for all files found
        $tmp = Array();
        // Add the files
        while($file = readdir($dir)) {
            // Make sure the file exists
            if($file != "." && $file != ".." && $file[0] != '.') {
                // If it's a directory, list all files within it
                if(is_dir($directory . "/" . $file)) {
                    $tmp2 = getFiles($directory . "/" . $file);
                    if(is_array($tmp2)) {
                        $tmp = array_merge($tmp, $tmp2);
                    }
                } else {
                    array_push($tmp, $directory . "/" . $file);
                }
            }
        }
        // Finish off the function
        closedir($dir);
        return $tmp;
    }
}

fonction récupérée sur php.net.

Juin 142011
 

voici en zsh, comment inverser un texte:

$ var="abc"
$ print -a ${(j::)${(Oas::)var}}
cba

j’ai cherché l’équivalent en bash, je n’ai pas trouvé.
par contre, je suis tombé la dessus en relisant la man page:

${parameter:offset}
${parameter:offset:length}
   Substring  Expansion.   Expands  to  up  to  length  characters of parameter starting at the character specified by offset.

voici ce que ça donne:

$ var=abc
$ for ((i=$((${#var}-1));i>=0;i--))do printf "${var:$i:1}";done    
cba
$ var='une chaine a retourner!'
$ for ((i=$((${#var}-1));i>=0;i--))do printf "${var:$i:1}";done
!renruoter a eniahc enu
Juin 142011
 

j’ai eu envie de centrer un texte hier sur mon terminal, afin de rendre plus lisible la sortie d’un script, voici comment j’ai fait, ça peut servir:

Download : txtcenter.sh#!/bin/bash

# message a afficher
MSG= »${*} »

# on verifie etre sur un terminal
tty >/dev/null
[ « $? » != « 0 » ] && echo « ${MSG} » && return 0

COLS= »$(tput cols) »
[ « $? » != « 0 » -o -n « $(echo ${COLS} |sed ‘s/[0-9]//g’) » ] && echo « ${MSG} » && return 0

# on entoure le message d’espaces
BORDER= »  »

# on peut centrer le texte maintenant
echo « ${MSG} » |awk \
-v COLS= »${COLS} » \
-v BORDER= »${BORDER} » \
‘{
MSG_LENGTH = length($0) ;
COLS = (COLS – MSG_LENGTH);
BORDER_LENGTH = length(BORDER) ;
for ( i = 1 ; i <= COLS ; i = (i + BORDER_LENGTH) ) { i = (i + BORDER_LENGTH) ; BORDER_MSG = BORDER_MSG BORDER; } printf ("%s%s%s\n",BORDER_MSG, $0, BORDER_MSG) ; }' [/bash]

Juin 142011
 

Problème:
j’ai fait une grosse archive tar (non compressée) et l’extraction des données a été interrompue suite à une corruption de disque.

tar est très lent a reprendre l’extraction ou il en était et échoue lamentablement au final à cause des erreurs rencontrées..
c’est parce que tar lit séquentiellement le fichier backup.tar, il travaille en bloc.

Solution :
créer un index des fichiers se trouvant dans l’archive, tar va lire l’intégralité du fichier une première fois mais ensuite, il n’aura plus à le relire entièrement.

$ FICHIER=archive.tar
$ tar --list --block-number --verbose --file=$FICHIER > ${FICHIER}.index

Continue reading »