[Shell] Création de Fichiers

Résolu
xavdoug Messages postés 21 Date d'inscription   Statut Membre -  
xavdoug Messages postés 21 Date d'inscription   Statut Membre -
Bonjour à tous,

J'ai créé le code suivant :
#! /bin/bash

set max1 = 0
set max2 = 0

if (test -e directory1/Sousdirectory-1) then
    max1 = $(ls directory1/Sousdirectory-*/    | grep -o '[0-9][0-9]*' | tail -1)
    max2 = $(ls directory2/Sousdirectory-*/ | grep -o '[0-9][0-9]*' | tail -1)
fi

set max = $max1

if [ "$max1" < "$max2" ]
    then
    max = $max2
fi

echo max = $max

max = $(expr $max + 1)

mkdir directory1/Sousdirectory-$max
mkdir directory2/Sousdirectory-$max


Je voudrais que :
- si dans directory1, il n'y a pas de sous-répertoire Sousdirectory-*, alors je veux créer Sousdirectory-1
- si dans directory1, il y a un sous-répertoire Sousdirectory-1, 2 ..., n, je veux créer le sous-répertoire Sousdirectory-(n+1).
Idem pour le directory2.

Merci d'avance pour votre précieuse aide.
Configuration: Windows XP
Internet Explorer 7.0

4 réponses

  1. xavdoug Messages postés 21 Date d'inscription   Statut Membre
     
    Quand j'exécute ce petit programme, il m'affiche :

    max =
    command not found

    Je ne vois pas trop ce qui le gêne ...
    0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Si je me souviens bien normalement ton shell c'est du "csh", non ?
    Donc :
    #! /bin/csh
    
    if ( -d directory1/Sousdirectory-1 ) then
       @ max1 = `ls directory1/ | grep -o '[0-9][0-9]*' | tail -1`
       @ max2 = `ls directory2/ | grep -o '[0-9][0-9]*' | tail -1`
    else
        echo "Le répertoire n'existe pas."
        exit
    endif
    
    @ max = $max1
    
    if ( "$max1" < "$max2" ) then
        @ max = $max2
    endif
    
    echo max = $max
    
    @ max = $max + 1
    
    mkdir directory1/Sousdirectory-$max
    mkdir directory2/Sousdirectory-$max
    
    ;-))
    0
  3. xavdoug Messages postés 21 Date d'inscription   Statut Membre
     
    J'ai un soucis avec le calcul du max et du min :
    @ min = `ls directory1/Sousdirectory-* | grep -o '[0-9][0-9]*' | head -1`
    @max = `ls directory2/Sousdirectory-* | grep -o '[0-9][0-9]*' | tail -1`
    

    Mes sous-dossiers sont classés comme suit :
    Sousdirectory-1
    Sousdirectory-10
    Sousdirectory-11
    ...
    Sousdirectory-55
    Sousdirectory-6
    Sousdirectory-7
    Sousdirectory-8
    Sousdirectory-9
    Seulement avec cette méthode, j'obtiens min = 1 (correct) et max = 9 (au lieu de 55). Comment puis-je m'y prendre dans ce cas pour calculer les valeurs correctement ?
    J'ai d'ailleurs, du mal à comprendre ce que fait réellement le grep -o [0-9][0-9] ... combien faudrait-il de crochets dans le cas d'un max égal à plusieurs millions ?

    Merci d'avance pour votre aide
    0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Écrit ta syntaxe comme ça :
    @max = `ls directory2 | sort -n -t- +1 | grep -o '[0-9][0-9]*' | tail -1`
    sort : trie les valeurs suivant les options qui suivent (man sort)
    -n : comparaison sur les valeurs numériques
    -t- : séparateur de champ (le tiret)
    +1 : comparaison sur le champ 2 (les champs commencent à 0)

    Édit : pffffffffffffffffffff ça ira plus vite et c'est moins compliqué, mais que je suis..........................bête des fois :
    @max = `ls directory2 | grep -o '[0-9][0-9]*' | sort -n | tail -1`

    que fait réellement le grep -o [0-9][0-9]*
    Il ne renvoie que la partie de la ligne correspondant à la "regex" (expression régulière).
    Ici on ne recherche que des valeurs numériques

    combien faudrait-il de crochets dans le cas d'un max égal à plusieurs millions ?
    C'est pas les crochets qui comptent en fait, c'est l'étoile (*) qui signifie de 0 à n chiffres. La répétition ([0-9][0-9]) n'est là que pour signifier qu'il en faut au moins 1.
    0
    1. xavdoug Messages postés 21 Date d'inscription   Statut Membre
       
      Comme d'habitude, tout est parfait et le programme tourne.
      Tu es vraiment le meilleur jipicy !!

      Merci encore pour les nombreuses fois où tu m'as aidé.
      :))
      0