Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2011, 14h21   #1
Futur Membre du Club
 
Inscription : février 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 12
Points : 19
Points : 19
Par défaut Avec la commande rm -f certains fichiers non supprimés! (noglob) ?

Bonjour à tous


aujourd'hui j'ai un petit problème au niveau de mon script

lorsque à la fin de mes actions je supprime mes fichiers temporaires il ne supprime pas tout

en effet
la fonction rmfile s execute correctement certains fichiers sont éffacés mais pas tous...

Avez vous une idée de ce qui pourrait causer cela ?

Car selon mon script
les fichiers sources commençant par ${code} devraient tous etre éffacé ce qui ne st pas le cas.






Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
 
#!/bin/ksh
# i24246 13/12/2011 mov fichierXFB
#set -x
NORMAL="\\033[0;39m"
SUCCESS="\\033[1;32m"
WARNING="\\033[1;33m"
FAILURE="\\033[1;31m"
HIGHLIGHT="\\033[1;1m"
source=/data/se-MQSI/se-xf-in/
dest=/data/se-MQSI
i=0
NbrB=2
rmfile()
                {
                        for code in $appcd
                        do
 
            if [ -s ${source}script/${code}.files ]
            then
                        rm -f ${source}script/${code}.files
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f ${source}script/${code}.files  \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f ${source}script/${code}.files  \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        echo suppression de ${source}script/${code}
                        if [ -s ${source}script/$code ]
            then
                        rm -f ${source}script/${code}*
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f ${source}script/${code}  \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f ${source}script/${code}  \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        echo suppression de $dest/se-FROM-${code}/*.files
                        if [ -s $dest/se-FROM-${code}/${code}.files ]
            then
                        rm -f $dest/se-FROM-${code}/${code}.files
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/*.files   \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/*.files        \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        echo suppression de $dest/se-FROM-${code}/${code}
                        if [ -s $dest/se-FROM-${code}/${code} ]
            then
                        rm -f $dest/se-FROM-${code}/${code}
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/${code}  \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/${code}  \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        done
                }
Check()
{
if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n Copying/Moving from $source$line to $dest/se-FROM-$code/$$.$line \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\nCopying/Moving Files $ from $source$line to $dest/se-FROM-$code/$$.$line \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
 
fi
}
Subfolder()
{
DF=`ls $dest/se-FROM-ISIS/ISIS*`
for isif in $DF
        do
                echo $isif
                LD=`echo $isif | cut -c35`
 
                echo $LD
 
 
                        if [ "$LD" == "U" ]
                                then
                                mv $isif $dest/se-FROM-$code/urgent-pay/$line
                        fi
                        if [ "$LD" == "P" ]
                                then
                                mv $isif $dest/se-FROM-$code/normal-pay/$line
                        fi
                        if [ "$LD" == "A" ] || [ "$LD" == "H" ]
                                then
                                mv $isif $dest/se-FROM-$code/admin-dat/$line
                        fi
        done
}
 
while [ "$i" -ne "$NbrB" ];
do
appcd="EGTF FBCP FBLC ISIS KLFI IY99"
        for code in $appcd
                do
                        echo ${source}script/$code
                        touch ${source}script/$code
                        chmod 777 ${source}script/$code
                        ls $code* > ${source}script/$code.files
                        chmod 777 ${source}script/$code.files
                        if [[ $? -eq 0 ]]
                                        then
                                        echo ${source}script/$code.files created successfully !!!
                                        cat ${source}script/$code.files
                                        fi
 
                                if [[ -s ${source}script/${code}.files ]]
                                        then
                                        { while read line;do
 
                                                echo $line
 
                                                cp ${source}script/$line $dest/se-FROM-$code/$$.$line
                                                Check
                                                        if [ "$code" == "EGTF" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                                        fi
 
                                                        if [ "$code" == "FBCP" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                Check
                                        fi
                                         if [ "$code" == "IY99" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                Check
                                        fi
                                                        if [ "$code" == "KLFI" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                            fi
                                                        if [ "$code" == "FBLC" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                                        fi
                                                        if [ "$code" == "ISIS" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                                                Subfolder
                                        fi
 
 
                                        if [ "$i" == "2" ]
                then
                rmfile
                fi
 
done } < ${source}script/${code}.files
                                                else
                                                        print "\n"
                                                        print "\n"
                                                        echo $HIGHLIGHT ALL FILE FROM $source ARE PROCESSED! You are now leaving the script . . . $NORMAL
                                                        rmfile
                                                        print "\n"
 
                                                        fi
 
                done
((i=i+1))
print "\n"
                                                        print "\n"
                                                        echo $HIGHLIGHT ALL FILE FROM $source ARE PROCESSED! You are now leaving the script . . . $NORMAL
rmfile
done
alexmirage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2011, 15h30   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
Bonjour,

la solution est pourtant simple : ne crée pas de fichiers temporaires !
et pour ce faire, n'utilise pas (JAMAIS ! ) la commande ls dans un script.

tu peux remplacer ces fichiers par un tableau, qui sera réinitialisé à la place d'écrire un fichTemp.

et tu remplaceras avantageusement les if [ "$code" =, par un
Code :
1
2
case $code in
FBCP) []
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/12/2011, 16h32   #3
Futur Membre du Club
 
Inscription : février 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 12
Points : 19
Points : 19
Et tu peux me dire pour quelle raison cela se comporte de cette manière ?
Est-il possible de résoudre cela sans réécrire le code ?

Car à l a base les fichiers sources arrivent assez librement
cela peut etre 1000 fichiers de quelques ko mais qui n arrivent pas en meme temps

Donc voilà pourquoi je fais un test -s sur le fichier qui est créé

car il se peut qu entre 2 run des nouveau fichiers arrivent et je ne voudrais pas qu'il retraite des fichiers déjà traités et ou supprimer des fichiers non traités


c est pourquoi j'ai travaillé comme cela et Je suis consciens que cela ne st pas très propre
alexmirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 17h05   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
ton script me donne mal à la tête, à force de relire les mêmes commandes mal foutues; des tests ± utiles, des echo comme dans DOS...
par où commencer ? tout réécrire, peut-être en revoyant l'algo (imagine-toi le faire "à la main"), et en n'utilisant que des commandes internes.

Citation:
car il se peut qu entre 2 run des nouveau fichiers arrivent
ce qui n'arrive pas avec un fichier, n'arrivera pas davantage avec un tableau.

une boucle for code in $appcd, qui appelle une fonction comportant ce même code, ça va poser problème.

--
je ne vais/peux pas réparer une fuite, quand le bateau prend l'eau de toutes parts.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 29/12/2011, 10h10   #5
Futur Membre du Club
 
Inscription : février 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 12
Points : 19
Points : 19
Ok je comprends mais si je mets mes fichiers dans un array n'y a t-il pas une limite au niveau du kernel qui t'empeche de faire un array plus grand que 1024 éléments ?
alexmirage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h55   #6
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
pas que j'ai observé :
Code :
1
2
3
4
5
$ for ((i=1; i<=2000; i++)); do array+=( item_$i ); done
$ printf '%s\n' "${array[@]}"
item_1
[...]
item_2000
et je n'ai rien vu avec la commande ulimit -a, qui le montre.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/12/2011, 14h28   #7
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par alexmirage Voir le message
Code bash :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
 
#!/bin/ksh
# i24246 13/12/2011 mov fichierXFB
#set -x
NORMAL="\\033[0;39m"
SUCCESS="\\033[1;32m"
WARNING="\\033[1;33m"
FAILURE="\\033[1;31m"
HIGHLIGHT="\\033[1;1m"
source=/data/se-MQSI/se-xf-in/
dest=/data/se-MQSI
i=0
NbrB=2
rmfile()
                {
                        for code in $appcd
                        do
 
            if [ -s ${source}script/${code}.files ]
            then
                        rm -f ${source}script/${code}.files
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f ${source}script/${code}.files  \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f ${source}script/${code}.files  \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        echo suppression de ${source}script/${code}
                        if [ -s ${source}script/$code ]
            then
                        rm -f ${source}script/${code}*
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f ${source}script/${code}  \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f ${source}script/${code}  \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        echo suppression de $dest/se-FROM-${code}/*.files
                        if [ -s $dest/se-FROM-${code}/${code}.files ]
            then
                        rm -f $dest/se-FROM-${code}/${code}.files
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/*.files   \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/*.files        \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        echo suppression de $dest/se-FROM-${code}/${code}
                        if [ -s $dest/se-FROM-${code}/${code} ]
            then
                        rm -f $dest/se-FROM-${code}/${code}
                        if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/${code}  \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\n rm -f $dest/se-FROM-${code}/${code}  \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
                        fi
                        fi
                        done
                }
Check()
{
if [ $? -eq 0 ]
                        then
                                        echo "$HIGHLIGHT\n Copying/Moving from $source$line to $dest/se-FROM-$code/$$.$line \t\t\t\t\t\t [$SUCCESS OK $NORMAL]"
 
                        else
                            echo "$HIGHLIGHT\nCopying/Moving Files $ from $source$line to $dest/se-FROM-$code/$$.$line \t\t\t\t\t\t [$FAILURE KO $NORMAL]"
 
fi
}
Subfolder()
{
DF=`ls $dest/se-FROM-ISIS/ISIS*`
for isif in $DF
        do
                echo $isif
                LD=`echo $isif | cut -c35`
 
                echo $LD
 
 
                        if [ "$LD" == "U" ]
                                then
                                mv $isif $dest/se-FROM-$code/urgent-pay/$line
                        fi
                        if [ "$LD" == "P" ]
                                then
                                mv $isif $dest/se-FROM-$code/normal-pay/$line
                        fi
                        if [ "$LD" == "A" ] || [ "$LD" == "H" ]
                                then
                                mv $isif $dest/se-FROM-$code/admin-dat/$line
                        fi
        done
}
 
while [ "$i" -ne "$NbrB" ];
do
appcd="EGTF FBCP FBLC ISIS KLFI IY99"
        for code in $appcd
                do
                        echo ${source}script/$code
                        touch ${source}script/$code
                        chmod 777 ${source}script/$code
                        ls $code* > ${source}script/$code.files
                        chmod 777 ${source}script/$code.files
                        if [[ $? -eq 0 ]]
                                        then
                                        echo ${source}script/$code.files created successfully !!!
                                        cat ${source}script/$code.files
                                        fi
 
                                if [[ -s ${source}script/${code}.files ]]
                                        then
                                        { while read line;do
 
                                                echo $line
 
                                                cp ${source}script/$line $dest/se-FROM-$code/$$.$line
                                                Check
                                                        if [ "$code" == "EGTF" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                                        fi
 
                                                        if [ "$code" == "FBCP" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                Check
                                        fi
                                         if [ "$code" == "IY99" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                Check
                                        fi
                                                        if [ "$code" == "KLFI" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                            fi
                                                        if [ "$code" == "FBLC" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                                        fi
                                                        if [ "$code" == "ISIS" ]
                                                                then
                                                                mv $dest/se-FROM-$code/$$.$line $dest/se-FROM-$code/$line
                                                                Check
                                                                Subfolder
                                        fi
 
 
                                        if [ "$i" == "2" ]
                then
                rmfile
                fi
 
done } < ${source}script/${code}.files
                                                else
                                                        print "\n"
                                                        print "\n"
                                                        echo $HIGHLIGHT ALL FILE FROM $source ARE PROCESSED! You are now leaving the script . . . $NORMAL
                                                        rmfile
                                                        print "\n"
 
                                                        fi
 
                done
((i=i+1))
print "\n"
                                                        print "\n"
                                                        echo $HIGHLIGHT ALL FILE FROM $source ARE PROCESSED! You are now leaving the script . . . $NORMAL
rmfile
done
Salut

En dehors des remarques de N_BaH (de mon coté je ne refuse pas forcément de mettre du "ls" dans un script (parce que moi je sais le gérer ) mais je cautionne à 100% la nécessité d'éviter les fichiers temporaires autant que possible), je suis étonné par cette indentation de m... Es-tu obligée de décaler tes blocs aussi aléatoirement ???
Tiens, juste un exemple
Code bash :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while [ "$i" -ne "$NbrB" ];
do
appcd="EGTF FBCP FBLC ISIS KLFI IY99"
        for code in $appcd
                do
                        echo ${source}script/$code
                        touch ${source}script/$code
                        chmod 777 ${source}script/$code
                        ls $code* > ${source}script/$code.files
                        chmod 777 ${source}script/$code.files
                        if [[ $? -eq 0 ]]
                                        then
                                        echo ${source}script/$code.files created successfully !!!
                                        cat ${source}script/$code.files
                                        fi
 
                                if [[ -s ${source}script/${code}.files ]]
                                        then
                                        ...

Le premier bloc while n'est pas décalé, le second bloc for est décalé deux fois, le second if pas au même niveau que le premier. Franchement tu trouves ce code lisible ? Tu crois que tu vas le relire facilement ? Et que les autres vont le lire et le comprendre facilement ??? Ecrire aussi mal laisse penser que t'en as rien à cirer de ton travail et ne nous donne donc pas envie de nous y intéresser...

Code bash :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
while [ "$i" -ne "$NbrB" ];
do
	appcd="EGTF FBCP FBLC ISIS KLFI IY99"
	for code in $appcd
	do
		echo ${source}script/$code
		touch ${source}script/$code
		chmod 777 ${source}script/$code
		ls $code* > ${source}script/$code.files
		chmod 777 ${source}script/$code.files
		if [[ $? -eq 0 ]]
		then
			echo ${source}script/$code.files created successfully !!!
			cat ${source}script/$code.files
		fi
 
		if [[ -s ${source}script/${code}.files ]]
		then
			...
		fi
	done
done
C'est pas un peu plus clair pour tout le monde comme ça ???

Autre question: ces chmod 777, c'est parce que tu ne connais rien aux droits Unix ou bien que tu as la flemme de réfléchir sur la meilleure façon de les optimiser (tout en conservant la confidentialité qui va bien) ??? Accessoirement, tu te plains que le "rm" ne fonctionne pas mais il faut savoir que la réussite du rm sur un fichier ne dépend que des droits du répertoire qui contient le fichier et non des droits du fichier lui-même. Donc ton fichier peut être en 000, si les droits du répertoire sont suffisants le fichier est quand-même effaçable. Et inversement le fichier peut être en 777, si les droits du répertoire ne sont pas suffisants le fichier ne pourra jamais être effacé.

Citation:
Envoyé par N_BaH Voir le message
je ne vais/peux pas réparer une fuite, quand le bateau prend l'eau de toutes parts.
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h14.


 
 
 
 
Partenaires

Hébergement Web