[Shell] Création de Fichiers

Résolu
xavdoug Messages postés 21 Statut Membre -  
xavdoug Messages postés 21 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.
A voir également:

4 réponses

xavdoug Messages postés 21 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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
xavdoug Messages postés 21 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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
É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
xavdoug Messages postés 21 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