Script KSH

abdoughazi Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

S'il vous plaît, j'aurais besoin d'aide sur un script ksh.
J'ai des fichiers sous cette forme :

HST_HST35G02_EDP_R0+45_G02R00C00_5909_I1523254.DATAE00
HST_HST35G02_EDP_H5+63_G02R00C00_5799_I1600063.DATAE00
HST_HST35G02_EDP_Q2+44_G02R00C00_5801_I1500213.DATAE00
HST_HST35G02_EDP_T1+31_G02R00C00_5801_I1500213.DATAE00
HST_HST35G02_EDP_R0+14_G02R00C00_5801_I1500213.DATAE00


Parmi ces fichiers, je dois déplacer ceux qui ont une combinaison "incorrecte" dans un répertoire poubelle.

Dans mon script, j'ai déclaré un tableau qui contient toutes les combinaisons correctes. Ensuite j'ai fait une boucle pour le parcourir et parcourir les fichiers que je veux traiter et une condition qui permet de détecter les combinaisons incorrectes et les déplacer :

#!/bin/ksh
DRCFR="1G+91 2G+93 3G+91 4G+94 A0+59 B2+33 C0+54 E0+21 F4+59 H3+63 H5+07 J1+83 J2+83 J4+07 K2+34 L1+54 M1+44 N2+45 P0+33 Q2+35 R0+14 S0+21 T1+31 U1+77 U2+79 U3+74 U6+78 W4+77"
set -A TABDRCFR $DRCFR
FICREPEDP=$(find /data/flf/35gchg/files/rejetChg/incft_HST/ -type f | grep "HST_HST35G02_EDP")
set -A TABFICREPEDP $FICREPEDP
i=0
for FICEDP in ${TABFICREPEDP[@]}
do
  while [ $i -lt ${#TABDRCFR[@]} ]
  do
    affichEDP=`ls $FICEDP | cut -c60-64`
    if [ $affichEDP != `echo ${TABDRCFR[$i]}` ]
    then 
      mv $FICEDP /data/flf/35gchg/files/rejetChg/pcr_poubelle_HST/
    else
      echo OK
      break
    fi 
    i=$((i+1))   
  done
done


Malheureusement, quand j'exécute le script, il déplace tous les fichiers ... Quelqu'un peut m'aider sur ce script s'il vous plaît ?

Merci
A voir également:

1 réponse

mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Bonjour,

Tu peux réaliser ton script beaucoup plus simplement et en une commande à l'aide d'
egrep
.

Dans un premier temps, je cherche les chaînes "correcte" partout dans le nom de fichier et dans un second temps je te montrerai comment ne chercher ce motif qu'à l'index 60.

Supposons que tes fichiers soient listés grâce à une commande arbitraire (disons le résultat d'un
find
). Moi j'ai mis tes noms de fichiers dans un fichier
toto.txt
, donc la commande
cat toto.txt
me les liste. Sur cette liste, je filtrer les lignes d'intérêt avec
egrep
:

cat toto.txt | egrep "G\+91|2G\+93|3G\+91|4G\+94|A0\+59|B2\+33|C0\+54|E0\+21|F4\+59|H3\+63|H5\+07|J1\+83|J2\+83|J4\+07|K2\+34|L1\+54|M1\+44|N2\+45|P0\+33|Q2\+35|R0\+14|S0\+21|T1\+31|U1\+77|U2\+79|U3\+74|U6\+78|W4\+77")


C'est à ces fichiers que nous allons appliquer le traitement (dans ton cas, le
mv
). Si tu veux appliquer le filtre contraire, il suffit de passer l'option
-v
à
egrep
.

Dans ton sript je n'ai pas trop compris pourquoi tu considérais l'index 60, par rapport à ton exemple je pense que ce serait plutôt l'index 17 (si on indexe les caractères à partir de 0). En complète l'expression en jetant les 17 premiers caractères

cat toto.txt | egrep --color ".{17}(G\+91|2G\+93|3G\+91|4G\+94|A0\+59|B2\+33|C0\+54|E0\+21|F4\+59|H3\+63|H5\+07|J1\+83|J2\+83|J4\+07|K2\+34|L1\+54|M1\+44|N2\+45|P0\+33|Q2\+35|R0\+14|S0\+21|T1\+31|U1\+77|U2\+79|U3\+74|U6\+78|W4\+77)"


Il ne reste plus qu'à injecter le résultat de cette commande dans
mv
. En bash, on utiliserait
$(...)
, en shell
`...`
et en ksh je te laisse chercher, mais avec un peu de chance c'est la même syntaxe :-) Voilà à quoi ça ressemble en bash :

mv $(cat toto.txt | egrep ".{17}G\+91|2G\+93|3G\+91|4G\+94|A0\+59|B2\+33|C0\+54|E0\+21|F4\+59|H3\+63|H5\+07|J1\+83|J2\+83|J4\+07|K2\+34|L1\+54|M1\+44|N2\+45|P0\+33|Q2\+35|R0\+14|S0\+21|T1\+31|U1\+77|U2\+79|U3\+74|U6\+78|W4\+77") dossier_destination


Bonne chance
0