Forum Programmation.shell SCRIPT SHELL

Posté par  . Licence CC By‑SA.
Étiquettes :
0
2
jan.
2020

bonjour tout le monde, je suis nouveau sur Linux et dans le cadre d'un stage je dois faire un petit script shell pour vérifier la présence des répertoires et les trier

je dois vérifier si les répertoires sont bien present sinon envoyer un incident.
Extraire les targets des fichiers.
Faire le tri de cette liste pour qu’il n’y est pas de doublons ou autre chose que des répertoires.
Vérifier que chaque ligne est un répertoire et qu’il est présent ;
Si le répertoire n’est pas présent créer une alerte >>> écriture dans le application.log d’une erreur.
Création d’un code Olga pour pouvoir envoyer vers un dossier

je suis arrivé a cette commande pour affiner un peu la liste, mais je dois quand meme faire le script et je suis perdu. merci d'avance du coup de main les gars.

grep target *|awk -F: '{print $2}'|sort -u|wc -l

  • # quelques pistes

    Posté par  . Évalué à 4. Dernière modification le 02 janvier 2020 à 16:21.

    vérifier si les répertoires sont bien present

    man find, avec l'option permettant de sélectionner des répertoires.

    Extraire les targets des fichiers.

    Je ne comprend pas ce que tu veux dire exactement ni le rapport avec le point précédent.

    Faire le tri de cette liste pour qu’il n’y est pas de doublons ou autre chose que des répertoires.

    Bien vu pour le sort

    Vérifier que chaque ligne est un répertoire et qu’il est présent ;

    Tu pourras le faire en bouclant sur chaque élément de ta liste. En shell tu peux tester si un fichier est un répertoire et s'il est bien présent à l'aide de la commande test ( ou via [ ).

    man echo, avec redirection vers un fichier. Attention à ne pas te tromper dans la redirection vers fichier ( faire la différence entre > et >> )

    Création d’un code Olga pour pouvoir envoyer vers un dossier

    Ca je ne comprends pas. Peux-tu détailler ?

    Sinon pour commencer, tu peux trouver de bons tutoriels sur la programmation shell. Par exemple

    https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux/42867-introduction-aux-scripts-shell
    https://abs.traduc.org/abs-fr/
    https://guidespratiques.traduc.org/guides/vf/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf

    • [^] # Re: quelques pistes

      Posté par  . Évalué à 1.

      Merci pour les infos.
      J’ai pu avancé un peu, je bloque sur la boucle for, je ne sais pas comment l’utiliser pour tester les répertoires.

      Merci pour les infos

    • [^] # Re: quelques pistes

      Posté par  . Évalué à 1.

      for directory in */ ; do
      echo $d
      done

      est ce que cette boucle marcherai pour ne lister que les dossiers de la liste ?
      merci

      • [^] # Re: quelques pistes

        Posté par  . Évalué à 4. Dernière modification le 03 janvier 2020 à 11:42.

        Hello.

        Ce qui est bien en shell c'est que tu peux tester …

        [totof@droopyfb ~]$ cd /tmp
        [totof@droopyfb /tmp]$ mkdir test1
        [totof@droopyfb /tmp]$ cd test1
        [totof@droopyfb /tmp/test1]$ mkdir dir1 dir2 dir3
        [totof@droopyfb /tmp/test1]$ touch file1 file2 file3
        [totof@droopyfb /tmp/test1]$ touch dir1/file1 dir2/file2 dir3/file3
        [totof@droopyfb /tmp/test1]$ for directory in */ ; do
        > echo $d
        > done

        Tu n'obtiens pas ce que tu veux ….

        Tandis qu'avec ça, c'est déjà mieux :

        [totof@droopyfb /tmp/test1]$ for directory in */
        > do
        > echo $directory
        > done
        dir1/
        dir2/
        dir3/

        Quand tu écris for <variable> in <expression>, tu demande au shell d'évaluer l'expression (qui est censé te retourner une liste de mots séparée par défaut par un ou plusieurs espaces ou une tabulation), puis de splitter cet liste chaine en utilisant le fameux séparateur, et de boucler sur chaque élément. La variable est une variable de boucle qui contiendra chaque élément de ta chaine tour a tour.

        Exemple :

        [totof@droopyfb /tmp/test1]$ for i in a b c
        > do
        > echo $i
        > done
        a
        b
        c
        

        Extrait de la page de man :

           Word Splitting
               The shell scans the results of parameter expansion, command
               substitution, and arithmetic expansion that did not occur within double
               quotes for word splitting.
        
               The shell treats each character of IFS as a delimiter, and splits the
               results of the other expansions into words using these characters as
               field terminators.  If IFS is unset, or its value is exactly
               <space><tab><newline>, the default, then sequences of <space>, <tab>,
               and <newline> at the beginning and end of the results of the previous
               expansions are ignored, and any sequence of IFS characters not at the
               beginning or end serves to delimit words.  If IFS has a value other
               than the default, then sequences of the whitespace characters space,
               tab, and newline are ignored at the beginning and end of the word, as
               long as the whitespace character is in the value of IFS (an IFS
               whitespace character).  Any character in IFS that is not IFS
               whitespace, along with any adjacent IFS whitespace characters, delimits
               a field.  A sequence of IFS whitespace characters is also treated as a
               delimiter.  If the value of IFS is null, no word splitting occurs.
        
  • # Wikibooks

    Posté par  (site web personnel) . Évalué à 3.

    Ce site m'avait déjà bien dépanné:
    https://fr.wikibooks.org/wiki/Programmation_Bash

    Un LUG en Lorraine : https://enunclic-cappel.fr

  • # en vrac

    Posté par  (site web personnel) . Évalué à 2. Dernière modification le 03 janvier 2020 à 20:03.

    En vrac formation accelérée

    #!/bin/bash
    
    [[ -e $elem ]] && echo "$elem existe"
    # ou
    if [[ -e $elem ]]; then
      echo "$elem existe"
    fi 
    
    [[ -d $dossier ]] && echo "$dossier est un dossier"
    [[ -f $fichier ]] && echo "$fichier est un fichier"
    
    # negation
    [[ ! -e $elem ]] && echo "$elem n'existe pas"
    # ou
    [[ -e $elem ]] || echo "$elem n'existe pas"
    
    for elem in *; do
      echo "Je parcours $elem"
    done
    
    # Recursif
    ## trouver les dossiers
    find . -type d
    ## trouver les fichiers
    find . -type f
    ## trouver les fichiers nommés toto*
    find . -type f -name "toto*"
    
    # boucle for sur find (non recommandé espace est un séparateur)
    for elem in $(find . -type d); do
      echo $elem est un dossier
    done
    
    # boucle while à préférer
    while read elem; do
      echo $elem est un dossier
    done < <(find . -type d)

    Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

    • [^] # Re: en vrac

      Posté par  (site web personnel) . Évalué à 1.

      # stat est l'outil adéquat pour avoir des infos sur les fichiers
      for elem in *; do
          if [[ "$(stat --format="%F" $elem)" == "répertoire" ]]; then
              echo "$elem" est un dossier
          fi
      done

      « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

      • [^] # Re: en vrac

        Posté par  . Évalué à 2.

        Je préfère quand même le find qui retourne que les dossiers si on lui demande avec la bonne option. Pas besoin de tester le type d'élément retourné.

Suivre le flux des commentaires

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