Forum Programmation.shell Projet menu interactif avec scan des dossiers

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
7
oct.
2024

Bonjour à tous,

Ce projet ne s'adresse pas au grand public mais seulement à son utilisateur.

Je cherche à :
-lister les dossiers présent dans le répertoire d'execution du script -> Fait , voir code ci-dessous
-afficher un menu avec autant d'entrée que de dossiers (1.dossier X ; 2.dossier Y ; …)
-gérer les X accès à créer en fonction des X répertoires trouvées.

J'ai trouvé ici un exemple de menu à afficher et une gestion des choix mais en statique.
https://bash.cyberciti.biz/guide/Menu_driven_scripts

Je me dis que ça sera plus simple de gérer l'évolution de ce dossier suivant les futurs besoins.

Debut de code : https://debian-facile.org/paste-B06D4C02DE-5f82a7986d18f04c0563505c8b229776

Merci pour vos retours.

  • # modeste aide

    Posté par  . Évalué à 2 (+1/-0).

    Salut, parfois je suis un peu long a comprendre…
    Je ne saisis pas bien ce que tu veux faire, si j'ai compris: afficher un menu avec les differents repertoires de ton repertoire courant, et quant tu en selectionne un … ca fait quoi? Et "gérer les X accès à créer en fonction des X répertoires trouvées", c'est sutrout ca que je ne comprends pas bien (au debut je croyais que tu parlais de Xorg haha).
    Je ne suis pas sur que je pourrais t'aider mais je penses que ca aidera les autres a te repondre.

    Ah oui une derniere question: tu veux un menu en ligne de commande ou GUI? Car sans GUI, j'avais fait un script (qui n'a rien a voir) mais qui affiche des tableaux avec un nombre de ligne crées a la volée, a voir si ca te conviens!

    • [^] # Re: modeste aide

      Posté par  . Évalué à 1 (+0/-0).

    • [^] # Re: modeste aide

      Posté par  . Évalué à 1 (+0/-0). Dernière modification le 07 octobre 2024 à 18:33.

      si j'ai compris: afficher un menu avec les differents repertoires de ton repertoire courant, et quant tu en selectionne un … ca fait quoi?

      Ca execute un fichier main.sh du répertoire sélectionné affiché également dans le menu interactif.

      Et "gérer les X accès à créer en fonction des X répertoires trouvées", c'est sutrout ca que je ne comprends pas bien (au debut je croyais que tu parlais de Xorg haha).

      Oui, ben disons que, pour chaque répertoire, on aura une entrée dans le menu et un cas dans un switch case qui lancera le script main.sh du répertoire sélectionnée.

      Ah oui une derniere question: tu veux un menu en ligne de commande ou GUI? Car sans GUI, j'avais fait un script (qui n'a rien a voir) mais qui affiche des tableaux avec un nombre de ligne crées a la volée, a voir si ca te conviens!

      En shell :/

      • [^] # Re: modeste aide

        Posté par  . Évalué à 1 (+0/-0).

        Ah ben en plus si dans chaque repertoires le script a executer est toujours du nom main.sh, ca sera encore plus simple! Le script que je t'ai envoyé t'a t-il aidé? Ou alors c'est trop cafouillit? Je l'ai presque pas commenté…

        Bien sur c'est donc pas fait avec un switch case, mais je ne penses pas que ca soit possible de faire comme ca, ou alors il faudrait generer a la volé un secon script bash et l'executer… mais ca me semble un peu sale comme approche!

        Le plus simple ca reste un tableau avec tes sous repertoirs et une boucle for ou while pour l'afficher, puis un read pour selectionner la reponse je penses … en tout cas c'est ce que j'aurais fait!

      • [^] # Re: modeste aide

        Posté par  . Évalué à 1 (+0/-0). Dernière modification le 08 octobre 2024 à 12:37.

        Dans ce gout la:

        #!/bin/bash
        
        # dès qu'une erreur est là -> on quitte le programme -> pour le dev
        set -e; set -u
        
        counter=0
        echo -e "Votre choix: \n"
        script_path="$(dirname "$(realpath "$0")")"
        
        # Stocker les dossiers trouvés dans une liste
        dirList=($(find "$script_path" -maxdepth 1 -type d -execdir echo {} \; | sed "s|^\./||"))
        
        # Parcourir la liste et afficher les options
        for line in "${dirList[@]}"; do
            counter=$((counter + 1))
            echo "$counter) $line"
        done
        
        read -p "Reponse: " reponse
        
        # Faire ce que tu veux avec la reponse, ici un realpath:
        realpath "${dirList[$reponse-1]}/"
        
        #dans ton cas un truc style : /bin/bash "${dirList[$reponse-1]}/main.sh"

        Bon la ya aucune gestion d'erreur et on peut certainement faire plus court…

      • [^] # Re: modeste aide

        Posté par  . Évalué à 1 (+0/-0). Dernière modification le 08 octobre 2024 à 12:48.

        Plus court (oui je m'ammuse):

        #!/bin/bash
        path="$(dirname "$(realpath "$0")")"
        dirList=($(find "$path" -maxdepth 1 -type d | sed "s|^\./||"))
        PS3="Votre choix: "
        select dir in "${dirList[@]}"; do
            [[ -n "$dir" ]] && realpath "$dir/" && break
        done

        Beaucoup plus court

        #!/bin/bash
        dirList=($(find "$(dirname "$(realpath "$0")")" -maxdepth 1 -type d | sed "s|^\./||"))
        select dir in "${dirList[@]}"; do realpath "$dir/" && break; done

        En une ligne:

        #!/bin/bash
        set -eu; select dir in $(find "$(dirname "$(realpath "$0")")" -maxdepth 1 -type d | sed "s|^\./||"); do realpath "$dir/" && break; done

        Bref! J'espere que ca t'a aidé!

  • # mc code source

    Posté par  . Évalué à 5 (+2/-0).

    vive l'opensource, tu peux aller voir ce que font les programmes comme

    • mc
    • ncdu

    et probablement d'autres

  • # lister les répertoires

    Posté par  . Évalué à 3 (+2/-0). Dernière modification le 08 octobre 2024 à 09:46.

    Bonjour

    Je n'ai pas compris ce qu'est :

    …le répertoire d'execution du script …

    ni ce que veut dire la ligne suivante :

    … -gérer les X accès à créer en fonction des X répertoires trouvées. …

    Mais il est possible de lister les répertoires rien qu'en utilisant bash :

    #!/bin/bash
    
    repSrc="$PWD" # Répertoire dans lequel la recherche des noms de répertoire devra être faite
    
    compteur=0
    for fich in $repSrc/*; do   # Pour chaque fichier trouvé dans le répertoire source
       if test -d "$fich"; then    # si c'est bien un fichier de type répertoire
           ((compteur++))             # alors incrémenter le compteur …
           printf '% 3d. %s\n' $compteur "$(basename "$fich")"  # … et afficher le nom du répertoire trouvé
       fi
    done

    Suivant ce qu'on veut en faire après, mettre la liste dans un tableau pourrait simplifier les choses :

    #!/bin/bash
    
    repSrc="$PWD" # Répertoire dans lequel la recherche des noms de répertoire devra être faite
    
    mesReps=()    # Pour créer un tableau nommé mesReps
    
    for fich in $repSrc/*; do   # Pour chaque fichier trouvé dans le répertoire source
       if test -d "$fich"; then      # si c'est bien un fichier de type répertoire
           mesReps+=("$(basename "$fich")") # alors ajouter le nom dans le tableau mesReps
       fi
    done
    
    # Afficher chacun des éléménts contenus dans le tableau mesReps
    for i in ${!mesReps[@]}; do
        printf '% 3d. %s\n' $((i+1)) "${mesReps[i]}"
    done
    • [^] # Re: lister les répertoires

      Posté par  . Évalué à 1 (+0/-0). Dernière modification le 08 octobre 2024 à 10:00.

      … rien qu'en utilisant bash

      J'avais oublié de remplacer :

      "$(basename "$fich")"

      par :

      "${fich##*/}"
  • # lapin

    Posté par  . Évalué à 2 (+0/-0).

    -gérer les X accès à créer en fonction des X répertoires trouvées.

    Je n'ai pas compris cette phrase, c'est quoi "X", c'est quoi un accès ?

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.