Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 10-03-2014 12:49:04

phlinux
Membre
Lieu : S-M
Distrib. : Jessie
Noyau : 4.6
(G)UI : Openbox (+Rox+Feh)
Inscription : 10-05-2009

Classement alpha en bash

Bjr,
Je ne connais pas le terme (classes?), ni si c'est possible en bash.
Je cherche un bout de code pour regrouper des fichiers (ou répertoires) dans différentes classes; c'est à dire tous ceux qui commencent par A, puis B etc..., le but étant de pouvoir sortir un menu où apparait d'abord le classement.

Dernière modification par phlinux (10-03-2014 12:49:25)


Pages perso : feh, omegat, udisks, sa station de travail comme passerelle

Hors ligne

#2 10-03-2014 14:04:36

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : Classement alpha en bash

Tu as des exemples de noms et d’arborescence?
En tout cas tu peux commencer par faire une liste de tout tes fichiers avec "ls", et les classer par ordre alphabétique avec un "sort" 
Genre:

 ls -R | sort -u

Hors ligne

#3 13-03-2014 18:24:12

phlinux
Membre
Lieu : S-M
Distrib. : Jessie
Noyau : 4.6
(G)UI : Openbox (+Rox+Feh)
Inscription : 10-05-2009

Re : Classement alpha en bash

Bjr,
Pour être plus clair ; comme je l'ai indiqué c'est dans le but de faire un menu, qui va, par exemple, lister les fichiers d'un répertoire et ces fichiers seront classés sous la première lettre de leur nom.
Pratiquement, sur l'entrée de menu qui correspond il y aura d'abord un premier menu avec la liste des lettres de l'alphabet et sous chacune, un sous-menu avec les fichiers qui commencent par la lettre choisie.
Cela existe en python (pour Openbox) mais si c'est possible en bash je préfère

Pages perso : feh, omegat, udisks, sa station de travail comme passerelle

Hors ligne

#4 13-03-2014 18:54:15

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : Classement alpha en bash

A mon avis, une fois que tu as la liste des fichiers, il faut faire une boucle  sur chaque lettre de l'alphabet


Ajouter dans un fichier la lettre A

echo Fichiers commençant par A >> madestination.txt


puis

grep '^[aA]' maliste >> madestination.txt



Ensuite on passe à la lettre B

echo Fichiers commençant par B >> madestination.txt


puis

grep '^[bB]' maliste >> madestination.txt



Etc, jusqu'a [zZ]
Ça ne devrait pas être trop compliqué

Hors ligne

#5 13-03-2014 19:09:50

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Classement alpha en bash

Ne pas oublier de mettre le reste quelque part aussi (tous les chiffres, les symboles, etc) smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#6 17-03-2014 11:22:32

phlinux
Membre
Lieu : S-M
Distrib. : Jessie
Noyau : 4.6
(G)UI : Openbox (+Rox+Feh)
Inscription : 10-05-2009

Re : Classement alpha en bash

Bjr,
Bon ça donne des pistes.
Apparemment  personne n'utilise de menu maison ici; parce que dès qu'on va fouiller dans un répertoire assez fourni le classement avec un pré-menu alphabétique s'impose.
Je vais voir comment goupiller un truc

Pages perso : feh, omegat, udisks, sa station de travail comme passerelle

Hors ligne

#7 30-01-2016 19:33:29

phlinux
Membre
Lieu : S-M
Distrib. : Jessie
Noyau : 4.6
(G)UI : Openbox (+Rox+Feh)
Inscription : 10-05-2009

Re : Classement alpha en bash

Pour donner l'image de ce que je cherche, voici un exemple avec un classement par extension

#!/bin/bash

#lanceur à utiliser
prog="rox"

cd $1

array_odt=()
array_ods=()
array_odg=()
array_fox=()
array_pdf=()
array_img=()
#array_jpeg=()
array_car=()
array_txt=()
array_rtf=()

function pipe_menu {
    # séparateur de champ à null
    OLD_IFS=$IFS
    IFS=''
    # semble créer l'item de menu et tester si des fichiers comportent une des chaines (odt, ods, etc...)
    local array_string="$2[*]"
    # si la classe est vide on n'affiche pas la chaine comme item de menu
    local loc_array=(${!array_string})
    if [[ ${#loc_array[@]} == 0 ]]; then return;fi
    # revenir à l'IFS par défaut
    IFS=$OLD_IFS
    echo "<menu id=\"menu_"$1"\" label=\"$1\">"
    for elt in ${loc_array[@]}
    do
      elt_base=`echo ${elt##*/}`
        echo "<item label=\"_${elt_base%.*}\" >"
        echo "<action name=\"Execute\"><execute>$prog $elt</execute></action></item>"
    done
    echo "</menu>"
}

for file in $1/*
do
  extension=${file##*.}
    if [[ $extension == "odt" ]]; then
        array_odt[${#array_odt[@]}]=$file
    elif [[ $extension == "ods" ]]; then
        array_ods[${#array_ods[@]}]=$file
    elif [[ $extension == "odg" ]]; then
        array_odg[${#array_odg[@]}]=$file  
    elif [[ $extension == "fox" ]]; then
        array_fox[${#array_fox[@]}]=$file
    elif [[ $extension == "pdf" ]]; then
      array_pdf[${#array_pdf[@]}]=$file
    elif [[ $extension == "jpg" ]]; then
        array_img[${#array_img[@]}]=$file
    elif [[ $extension == "jpeg" ]]; then
        array_img[${#array_img[@]}]=$file
    elif [[ $extension == "png" ]]; then
        array_img[${#array_img[@]}]=$file
     elif [[ $extension == "bmp" ]]; then
        array_img[${#array_img[@]}]=$file  
    elif [[ $extension == "car" ]]; then
        array_car[${#array_car[@]}]=$file  
    elif [[ $extension == "txt" ]]; then
        array_txt[${#array_txt[@]}]=$file
    elif [[ $extension == "rtf" ]]; then
        array_rtf[${#array_rtf[@]}]=$file
    fi
done

echo "<openbox_pipe_menu>"

pipe_menu "fox" array_fox
pipe_menu "pdf" array_pdf
pipe_menu "images" array_img
#pipe_menu "jpeg" array_jpeg
pipe_menu "cartes" array_car
pipe_menu "odt" array_odt
pipe_menu "ods" array_ods
pipe_menu "odg" array_odg
pipe_menu "rtf" array_rtf
pipe_menu "txt" array_txt

echo "<item id=\"rox_ob\" label=\"_Rox\" >"
echo "<action name=\"Execute\"><execute>rox $1</execute></action></item>"
echo "<item id=\"txt_ob\" label=\"_Brouillon__ajout\" >"
echo "<action name=\"Execute\"><execute>xterm -e ~/.script/index_new_synth.ph</execute></action></item>"
echo "</openbox_pipe_menu>"

exit 0
 


Pages perso : feh, omegat, udisks, sa station de travail comme passerelle

Hors ligne

#8 31-01-2016 11:42:05

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : Classement alpha en bash

C'est pour l'utiliser dans le même contexte ?

Sinon, j'ai trouvé un truc suspect dans ce programme d'exemple. Ligne 6 :


cd $1
 


Jusque là tout va bien, mis à part qu'utiliser cd dans script est souvent un bon moyen
de se planter… la preuve, ligne 40 :


for file in $1/*
 


Comme on est déjà dans le répertoire destination (grâce au cd $1 précédent), ça ne donnera pas le résultat escompté…

Dernière modification par enicar (31-01-2016 12:03:10)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#9 31-01-2016 13:31:45

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : Classement alpha en bash

Sur le modèle que tu as donné, je te propose le script suivant, je ne
sais pas s'il fera ce que  tu désires, à tester :


#!/bin/bash

#lanceur à utiliser
prog="rox"

array_aA=()
array_bB=()
array_cC=()
array_dD=()
array_eE=()
array_fF=()
array_gG=()
array_hH=()
array_iI=()
array_jJ=()
array_kK=()
array_lL=()
array_mM=()
array_nN=()
array_oO=()
array_pP=()
array_qQ=()
array_rR=()
array_sS=()
array_tT=()
array_uU=()
array_vV=()
array_wW=()
array_xX=()
array_yY=()
array_zZ=()
array_others=()


function pipe_menu {
    # séparateur de champ à null
    OLD_IFS=$IFS
    IFS=''
    # semble créer l'item de menu et tester si des fichiers comportent une des chaines (odt, ods, etc...)
    local array_string="$2[*]"
    # si la classe est vide on n'affiche pas la chaine comme item de menu
    local loc_array=(${!array_string})
    if [[ ${#loc_array[@]} == 0 ]]; then return;fi
    # revenir à l'IFS par défaut
    IFS=$OLD_IFS
    echo "<menu id=\"menu_"$1"\" label=\"$1\">"
    for elt in ${loc_array[@]}
    do
      elt_base=`echo ${elt##*/}`
        echo "<item label=\"_${elt_base%.*}\" >"
        echo "<action name=\"Execute\"><execute>$prog $elt</execute></action></item>"
    done
    echo "</menu>"
}

cd "$1"
IFS=$'\n'

for file in $(ls -A|sort --ignore-case)
do
    case "$file" in
        [aA]*) array_aA[${#array_aA[@]}]="$file";;
        [bB]*) array_bB[${#array_bB[@]}]="$file";;
        [cC]*) array_cC[${#array_cC[@]}]="$file";;
        [dD]*) array_dD[${#array_dD[@]}]="$file";;
        [eE]*) array_eE[${#array_eE[@]}]="$file";;
        [fF]*) array_fF[${#array_fF[@]}]="$file";;
        [gG]*) array_gG[${#array_gG[@]}]="$file";;
        [hH]*) array_hH[${#array_hH[@]}]="$file";;
        [iI]*) array_iI[${#array_iI[@]}]="$file";;
        [jJ]*) array_jJ[${#array_jJ[@]}]="$file";;
        [kK]*) array_kK[${#array_kK[@]}]="$file";;
        [lL]*) array_lL[${#array_lL[@]}]="$file";;
        [mM]*) array_mM[${#array_mM[@]}]="$file";;
        [nN]*) array_nN[${#array_nN[@]}]="$file";;
        [oO]*) array_oO[${#array_oO[@]}]="$file";;
        [pP]*) array_pP[${#array_pP[@]}]="$file";;
        [qQ]*) array_qQ[${#array_qQ[@]}]="$file";;
        [rR]*) array_rR[${#array_rR[@]}]="$file";;
        [sS]*) array_sS[${#array_sS[@]}]="$file";;
        [tT]*) array_tT[${#array_tT[@]}]="$file";;
        [uU]*) array_uU[${#array_uU[@]}]="$file";;
        [vV]*) array_vV[${#array_vV[@]}]="$file";;
        [wW]*) array_wW[${#array_wW[@]}]="$file";;
        [xX]*) array_xX[${#array_xX[@]}]="$file";;
        [yY]*) array_yY[${#array_yY[@]}]="$file";;
        [zZ]*) array_zZ[${#array_zZ[@]}]="$file";;
        *) array_others[${#array_others[@]}]="$file";;
    esac
done

echo "<openbox_pipe_menu>"

pipe_menu "aA" array_aA
pipe_menu "bB" array_bB
pipe_menu "cC" array_cC
pipe_menu "dD" array_dD
pipe_menu "eE" array_eE
pipe_menu "fF" array_fF
pipe_menu "gG" array_gG
pipe_menu "hH" array_hH
pipe_menu "iI" array_iI
pipe_menu "jJ" array_jJ
pipe_menu "kK" array_kK
pipe_menu "lL" array_lL
pipe_menu "mM" array_mM
pipe_menu "nN" array_nN
pipe_menu "oO" array_oO
pipe_menu "pP" array_pP
pipe_menu "qQ" array_qQ
pipe_menu "rR" array_rR
pipe_menu "sS" array_sS
pipe_menu "tT" array_tT
pipe_menu "uU" array_uU
pipe_menu "vV" array_vV
pipe_menu "wW" array_wW
pipe_menu "xX" array_xX
pipe_menu "yY" array_yY
pipe_menu "zZ" array_zZ
pipe_menu "others" array_others

echo "<item id=\"rox_ob\" label=\"_Rox\" >"
echo "<action name=\"Execute\"><execute>rox $1</execute></action></item>"
echo "<item id=\"txt_ob\" label=\"_Brouillon__ajout\" >"
echo "<action name=\"Execute\"><execute>xterm -e ~/.script/index_new_synth.ph</execute></action></item>"
echo "</openbox_pipe_menu>"

exit 0
 



Ça semble fonctionner, je n'ai pas essayé d'utiliser le résultat comme
menu pour openbox (je n'utilse pas le menu de openbox…). On peut
faire beaucoup plus rapide, en utilisant des fichiers temporaires
et grep pour construire les différents tableaux. Je te laisse
faire cela en exercice big_smile

Aussi, ce script ne fonctionnera que si tes fichiers ne comportent pas de
caractères « \n » dans leur nom. Ce qui devrait ne pas être le cas, mais
je préfère  prévenir wink

Dernière modification par enicar (31-01-2016 15:01:12)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#10 31-01-2016 14:52:52

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : Classement alpha en bash

J'ai testé en générant un menu pour openbox, et ça marche \o/. Par contre c'est un peu long
d'attendre que le menu se généré quand on a la souris qui a pointé sur le menu…

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#11 31-01-2016 16:40:22

phlinux
Membre
Lieu : S-M
Distrib. : Jessie
Noyau : 4.6
(G)UI : Openbox (+Rox+Feh)
Inscription : 10-05-2009

Re : Classement alpha en bash

Bjr,
Pour le "cd $1" du script: ça fonctionne bien. Voilà un exemple de commande du pipemenu

/home/phlinux/.script/obm_ext_doc.ph /media/stock/documents


Pour les listes des "array", et du "case" à la fin, c'est ce que je veux éviter; fastidieux de tout taper sans rien oublier, non ? Il y a des scripts similaires en python qui utilisent des "classes", et je voulais savoir si en bash c'est possible.

Pour la lenteur du script: c'est évidemment dommage de perdre la rapidité d'openbox.

Dans tous les cas je vais relire tes indications et voir ce que je peux en tirer.

Merci d'être passé, c'est sympa.


Pages perso : feh, omegat, udisks, sa station de travail comme passerelle

Hors ligne

#12 31-01-2016 16:59:02

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : Classement alpha en bash

phlinux a écrit :

Pour les listes des "array", et du "case" à la fin, c'est ce que je veux éviter; fastidieux de tout taper sans rien oublier, non ?


Bah, il faut faire un programme qui génère ces parties du script wink

phlinux a écrit :

Il y a des scripts similaires en python qui utilisent des "classes", et je voulais savoir si en bash c'est possible.


On doit pouvoir faire quelque chose de bien plus rusé en bash, j'en suis sûr
mais je ne sais pas comment smile Aussi, ça doit être vraiment mieux fait en
python…


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#13 01-02-2016 15:18:02

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : Classement alpha en bash

phlinux a écrit :

Il y a des scripts similaires en python qui utilisent des "classes", et je voulais savoir si en bash c'est possible.



J'aimerai savoir précisément ce que tu entends par « classes ». Pour
moi, ce terme désigne les classes d'objets, donc c'est relatif
à la programmation par objet. Évidemment, bash ne possède pas
cette fonctionnalité.

En python, j'aurais utilisé un dictionnaire dont les clefs
seraient les letrres de l'alphabet et les valeurs, des tableaux
contenant les noms triés du répertoire à traiter.

En bash les dictionnaire existent (on appelle cela des tableaux
associatifs). Ils sont beaucoup plus limités que les dictionnaires de
python. Il n'y a pas un moyen propre pour avoir comme élément un
tableau comme en python. Il doit exister une bidouille, mais bon…


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

Pied de page des forums