Too many words from ``

Too many words from `` - Shell/Batch - Programmation

Marsh Posté le 20-02-2006 à 13:37:23    

J' ai fait un script qui recherche certains fichier et dossiers par leur noms et les suppriment
 
le voici

Citation :


#!/bin/csh
if ( $1 == "" ) then
        set dossier=$cwd
else
        set dossier=$1
endif
echo "nettoyage fichiers inutiles"
/bin/rm -rf /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.TEMP*'  -print >  /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.LOCK*'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '.nfs*'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*#RD*'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pd.gbf'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pd.bgf'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*root*'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name 'vp_links'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*_temp*'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pict'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pict'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.attr'  -print >>  /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.CATPart'  -print >> /tmp/fichier_a_supprimer_$USER
 
if (-z  /tmp/fichier_a_supprimer_$USER) then
        echo "Pas de fichier a supprimer"
 
else
 
        echo " *** fichiers supprime dans /tmp/fichier_a_supprimer_$USER *** "
        echo " "
        foreach fic (`cat /tmp/fichier_a_supprimer_$USER`)
                /bin/rm -rf $fic
        end
endif
 
echo " changements droits globaux  755"
chmod -R 755 $dossier
echo "creation des dossiers vp_links"
/export/data/it-store/scripts/caddsenabvp $dossier
echo " changements proprietaire cadds5:caomeca"
chown -R cadds5:caomeca $dossier
 
 


 
Lorsque je lance le scripts sur un dossier contenant un petit nombre de dossier ca fonctionne bien.
par contre dans un repertoire contenant 811 repertoires j'ai ce resultat
 

Citation :


# de.csh maj-nbes
nettoyage fichiers inutiles
 *** fichiers supprime dans /tmp/fichier_a_supprimer_root ***
 
Too many words from ``


 
apparemment quand le fichier /tmp/fichier_a_supprimer est trop long le foreach ne marche plus.
 
Quelqu'un a une idée de comment contourner le probleme
merci d'avance
 
 

Reply

Marsh Posté le 20-02-2006 à 13:37:23   

Reply

Marsh Posté le 20-02-2006 à 13:54:38    

Je te propose une alternative :
 


#!/bin/csh
if ( "$1" == "" ) then
        set dossier=$cwd
else
        set dossier=$1
endif
 
echo "Nettoyage fichiers inutiles"
\rm -rf /tmp/fichier_a_supprimer_$USER
 
foreach i ( .TEMP .LOCK .nfs #RD root _temp .attr .CATPart )
   echo "Nettoyage : *${i}*..."
   find $dossier -name "*${i}*" -exec \rm -f {} \;
end
 
foreach i ( _pd.gbf _pd.bgf vp_links _pict )
   echo "Nettoyage : $i..."
   find $dossier -name "${i}" -exec \rm -f {} \;
end

Reply

Marsh Posté le 20-02-2006 à 14:38:12    

merci Elmoricq
 
j'ai refait le script en sh avec les indications que m'avais donné juste avant que tu modifies ton post
ca marche beaucoup mieux
le voici
 

Citation :


#!/bin/sh
if [ "$1" = "" ]
then
        dossier=$cwd
else
        if [ ! -d $1 ]
        then
                echo " $1 n existe pas "
        exit
        else
                dossier=$1
        fi
fi
echo "nettoyage fichiers inutiles"
/bin/rm -f /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.TEMP*'  -print >  /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.LOCK*'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '.nfs*'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*#RD*'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pd.gbf'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pd.bgf'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*root*'  -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name 'vp_links'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*_temp*'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pict'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '_pict'   -print >> /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.attr'  -print >>  /tmp/fichier_a_supprimer_$USER
find $dossier -name '*.CATPart'  -print >> /tmp/fichier_a_supprimer_$USER
 
if [ -z  /tmp/fichier_a_supprimer_$USER ]
then
        echo "Pas de fichier a supprimer"
else
 
        echo " *** fichiers supprime dans /tmp/fichier_a_supprimer_$USER *** "
        echo " "
cat /tmp/fichier_a_supprimer_$USER |while read i
do
        rm -rf "$i"
done
fi


 
La ou ca pourrait etre optimisé c'est dans le find
j'en fait un pour chaque element
dans ton alternative le find est répété dans la boucle donc ca dois prendre le meme temps je pense
on dois pouvoir faire une requete plus complexe avec le find mais j'ai pas trop envie de chercher.
 
merci beaucoup Elmoricq
 
ps: rm -rf c'est parcque "vplinks" c'est un repertoire


Message édité par boiboi le 20-02-2006 à 14:41:54
Reply

Marsh Posté le 20-02-2006 à 15:07:17    

Je n'ai pas modifié mon post, quelqu'un a effacé le sien, je n'ai pas retenu qui c'était.  
Néanmoins en sh/ksh, la boucle foreach du csh devient :

for i in  .TEMP .LOCK .nfs #RD root _temp .attr .CATPart  
do
...
done


 
Côté optimisation, on s'en moque totalement, du moment que le principe de base est correct (pas si l'on fait n'importe quoi qui met 2h au lieu de 2min).  
C'est du script-shell, pas un programme clustering de la NASA hein, sur ce genre de chose, la maintenabilité est bien plus importante qu'une quelconque micro-optimisation.

Reply

Marsh Posté le 20-02-2006 à 15:21:44    

oki doki,
 
merci beaucoup de ton aide.
 
c'est quand meme bien sympa d'avoir de l'aide sur les forums quand on est bloqué

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed