IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Créer un script qui va lire tous les dossiers et appliquer une commande


Sujet :

Shell et commandes GNU

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Créer un script qui va lire tous les dossiers et appliquer une commande
    Bonjour à tous,

    J'ai créé une petite application web.
    Le contenus sont des fichier Markdown que je converti en html avec la commande suivante, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o install-ubuntu-18-04.html install-ubuntu-18-04.md
    Ce repertoire web a plusieurs dossiers et je n'aimerais pas naviguer jusqu'au fichier.md pour lancer la commande de dessus, en modifiant le fichier à convertir.

    L'idée est de créer dans /home/user/.bashrc un ligne qui lorsque je tape la commande md, il va lancer une commander qui va parcourir tous les dossiers enfant et lorsqu'il rencontre un fichier avec l'extention md, il va le convertir en html en concervant le même non de fichier. Evidemment, le fichier convertir doit se trouver dans le même dossier

    Par exemple, dans mon fichier .bashrc, je pourrais créer ceci:
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function c() { 
        #cd $* && ls 
    }

    mais je ne sais pas comment remplacer ce que je j'ai commenté pour
    1. Il parcour tous les dossiers enfant à /var/www/html/wiki
    2. S'il rencontre un fichier avec l'extension .md, il applique la commande pandoc sur ce(s) fichier(s)
    3. La conversion du fichier doit se trouver au même niveau


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o le-fichier-lu.html le-fichier-lu.md
    Ainsi, je n'aurai qu'à ouvrir mon terminal et taper la commande 'md' et tous les kfichiers .md seront convertis en une fois..


    Voyez-vous?
    Je vous remercie
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Dans des notes, j'ai trouvé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function md(){
            for d in /var/www/html/Wiki/;
            do echo $d;
            sudo find $d -type f -name "*.md";
            done;
    }
    Ce qui me liste bien tous les fichiers avec l'extention .md, quand je tape md dans mon terminal

    Mais alors comment récupérer le nom du fichier (je pense avant le ;done)
    pour faire la conversion??
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    Bonjour,

    la boucle [c]for[c] est inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /repertoire -options... -execdir pandoc... {} \;
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Hello
    Merci pour ta réponse, mais je ne vois toujours pas comment, je peux récupérer le nom de fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo find /var/www/html/Wiki/ -type f -name "*.md" -execdir pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o $file.html $file.md;
    J'imagine que le $file, ne fonctionnera pas
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    -print cf. man find.
    voire -printf si tu ne veux pas que le chemin soit affiché
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo find /var/www/html/Wiki/ -type f -name "*.md" -execdir pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o $file.html $file.md;
    J'imagine que le $file, ne fonctionnera pas
    Effectivement, pour faire simple, le fichier trouvé par "find" est référencé par {}, comme indiqué dans le message de N_BaH.

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour.

    D'accord, mais actuellement, j'affiche ceci par exemple
    /var/www/html/Wiki/IT-help.md
    donc {} va m'afficher
    /var/www/html/Wiki/IT-help.md
    ou ceci
    mais alors comment remplacer .md par .html dans ma commande pandoc, dans cette partie:

    (je sais pas trop comment écrire cette partie)
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "$repertoire" -type f -iname '*.md' -execdir sh -c 'echo "$1 ./$(basename -s md "$1")html"' sh {} \;
    echo est bien sûr à remplacer par la commande pandoc.

    j'utilise basename parce que je ne parviens pas à effectuer un Remplacement de paramètres avec -exec.
    il me semble qu'on en a déjà parlé ici, mais je ne retrouve pas la discussion...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    On peut avoir besoin de plus d'une instruction. La boucle n'est alors pas mauvaise. Et je n'aime pas trop -exec de find.

    Pour connaître le temps (a priori) de toutes les videos et sons de /home/Flodelarab, je tape ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ~ -type f -name "*.mp[34]" -printf "%p\n" | while IFS='' read -r fichier; do echo -n "$fichier ";mplayer -vo dummy -ao dummy -identify 2>/dev/null "$fichier" |sed '/ID_LENGTH/!d';done
    Si je voulais convertir tous les fichiers *.md à chaque lancement de console, je ferais sans doute un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ~ -type f -name "*.md" -printf "%p\n" | while IFS='' read -r fichier; do ma.ou.mes.commande(s).de.conversion.bash "$fichier" ; done
    Pas de récursion ou question de dossier.

    D'autre part, je n'exécuterais rien dans le .bashrc. J'installerais juste un alias.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Hello!!

    je suis arrivé à ceci
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     ## Teste 3
            sudo find /var/www/html/Wiki/ -type f -name "*.md" | while IFS='' read -r absolute; 
            do path="$(dirname -- $absolute)";
            filename="$(basename -- $absolute)";
            extension="${filename##*.}";
            file="${filename%.*}";
            echo 'Converting '$path'/'$file'.'$extension' to '$path'/'$file'.html';
            pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o $path'/'$file'.html' $path'/'$file'.md';
            echo 'Done!';
            done;

    Qu'en pensez-vous?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Qu'en pensez-vous?
    * Pourquoi pas. C'est bon

    * Les points virgules en fin de lignes ne sont pas obligatoires.

    * Tu ne vérifies pas que la conversion a déjà été faite ? Sinon, tu risques de faire des milliers de fois la même conversion.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Hello
    Tu ne vérifies pas que la conversion a déjà été faite ? Sinon, tu risques de faire des milliers de fois la même conversion.
    Non, je ne le fais pas. C'est pas trop grave.

    J'ai une dizaine de fichier .md mais avec le temps ca va évoluer.
    L'idée est des que je modifie un fichier ou si j'en ajoute un, que je n'aie pas besoin de faire des cd jusqu'au(x) fichier(s) modifié(s).

    Ainsi en tapant 'md', tous se met à jour. Je pourrais évoluer ceci plus tard, mais pour le moment ca me va bien (J'ai des truc plus urgent à faire )

    Mercii
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    il manque des guillemets autour de certaines variables, et il y a des apostrophes inutiles .
    basename et dirname sont inutiles : le Remplacement de paramètres peut faire la même chose.

    finalement, à quoi sert de "découper" le chemin du nom de fichier ?
    il suffirait d'enlever l'extension.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour à tous
    Je m'appercois avoir un petit problème avec les images
    Par exemple dans le dossier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /var/www/html/wiki/projet/
    j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /var/www/html/wiki/projet/img/exemple.jp
    /var/www/html/wiki/projet/index.md
    dans mon fichier md, je fais référence à une image de la sorte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ![exemple](img/exemple.jpg)
    Quand je tape cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cd /var/www/html/wiki/projet/
    pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o index.html index.md
    mon fichier index.html est très bien comverti avec l'image.

    Par contre quand je lance le script depuis /home/mon_home
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sudo find /var/www/html/wiki/ -type f -name "*.md" | while IFS='' read -r absolute;
    do path="$(dirname -- $absolute)";
    filename="$(basename -- $absolute)";
    extension="${filename##*.}";
    file="${filename%.*}";
    echo 'Converting '$path'/'$file'.'$extension' to '$path'/'$file'.html';
    pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o $path'/'$file'.html' $path'/'$file'.md';
    echo -e 'Done!\n';
    done;
    j'ai ce message d'erreur
    pandoc: Could not fetch img/exemple.jpg
    img/exemple.jpg: openBinaryFile: does not exist (No such file or directory)
    ceci parce que le script n'est pas lancé depuis
    /var/www/html/wiki/projet/

    la question est alors comment remédier à ce probleme sans donné le chemin absolut de l'image?

    Merci pour vos lumières
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    ceci parce que le script n'est pas lancé depuis
    /var/www/html/wiki/projet/

    la question est alors comment remédier à ce probleme sans donné le chemin absolut de l'image?
    Apparemment, pandoc ne fait pas bien son boulot pour les fichiers inclus, puisque tu dis que ça fonctionne en lançant le script depuis "/var/www/html/wiki/projet/".
    Pour y remédier, il me semble que le plus simple est de te déplacer dans le répertoire avant de lancer la commande, donc quelque chose comme ceci (non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo find /var/www/html/wiki/ -type f -name "*.md" | while IFS='' read -r absolute;
        do path="$(dirname -- $absolute)"
        filename="$(basename -- $absolute)"
        extension="${filename##*.}"
        file="${filename%.*}"
        echo "Converting '${path}/${file}.${extension}' to '${path}/${file}.html'"
        cd "${path}"
        pandoc -s --self-contained -A /var/www/html/sys/md/footer.html --toc --toc-depth=3 -c /var/www/html/sys/md/markdown-pandoc.css -o "${file}.html" "${file}.md"
        echo -e 'Done!\n'
        done
    Dr plus, j'ai fait le ménage dans les apostrophes...

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... -print0 | while IFS='' read -d '' -r filenameNpath...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/03/2018, 11h42
  2. Réponses: 8
    Dernier message: 16/03/2007, 16h43
  3. Réponses: 4
    Dernier message: 13/02/2007, 16h23
  4. Comment créer un champs qui additionne
    Par Didi17 dans le forum Access
    Réponses: 2
    Dernier message: 16/10/2005, 18h51
  5. Comment créer un script?
    Par sitdown dans le forum Windows
    Réponses: 1
    Dernier message: 25/08/2005, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo