[Shell] Création de Fichiers [Résolu/Fermé]

Signaler
Messages postés
21
Date d'inscription
samedi 21 avril 2007
Statut
Membre
Dernière intervention
16 novembre 2007
-
Messages postés
21
Date d'inscription
samedi 21 avril 2007
Statut
Membre
Dernière intervention
16 novembre 2007
-
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.

4 réponses

Messages postés
21
Date d'inscription
samedi 21 avril 2007
Statut
Membre
Dernière intervention
16 novembre 2007

Quand j'exécute ce petit programme, il m'affiche :

max =
command not found

Je ne vois pas trop ce qui le gêne ...
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 838
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
;-))
Messages postés
21
Date d'inscription
samedi 21 avril 2007
Statut
Membre
Dernière intervention
16 novembre 2007

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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 838
É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.
Messages postés
21
Date d'inscription
samedi 21 avril 2007
Statut
Membre
Dernière intervention
16 novembre 2007

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é.
:))