Script KSH

Fermé
abdoughazi Messages postés 1 Date d'inscription mardi 28 septembre 2021 Statut Membre Dernière intervention 28 septembre 2021 - Modifié le 28 sept. 2021 à 17:57
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 29 sept. 2021 à 13:44
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
Modifié le 29 sept. 2021 à 13:50
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