Shell aide sur mon script

Shell aide sur mon script - Shell/Batch - Programmation

Marsh Posté le 16-03-2007 à 15:07:13    

J'ai des competences en shell bash mais pas assez pour faire ce script
 
2 paramètres a renseigner en debut de script
- le dossier
- taille du dossier max en mega
 
Si le dossier a une taille > taille max --> on efface LE plus vieux fichier(il peut avoir des sous dossiers, sur plusieur niveaux),
si un sous dossiers est vide le supprimer.
 
J'espère être clair
Merci @+ franck

Message cité 1 fois
Message édité par dd_pak le 20-03-2007 à 11:10:05
Reply

Marsh Posté le 16-03-2007 à 15:07:13   

Reply

Marsh Posté le 17-03-2007 à 19:10:50    

dd_pak a écrit :

J'ai des competences en shell bash mais pas assez pour faire ce script
 
2 paramètres a renseigner en debut de script
- le dossier
- taille du dossier max en mega
 
Si le dossier a une taille > taille max --> on efface LE plus vieux fichier(il peut avoir des sous dossiers, sur plusieur niveaux),
si un sous dossiers est vide le supprimer.
 
J'espère être clair
Merci @+ franck


 
Bon, déjà un gros danger à prévoir => si tu fais "ls -ld dossier" tu n'obtiendras pas la taille du dossier dans le sens "taille cumulée de tous ses fichiers" mais tu obtiendras la taille du dossier dans le sens "taille utilisée pour stocker tous les noms des fichiers qui s'y trouvent"
Pour trouver la taille d'un dossier, tu dois utiliser la commande "du -sk dossier"
 
Ensuite, pour trouver le plus vieux fichier d'un répertoire, tu peux utiliser l'option "-t" de "ls" qui te donne les fichiers classés par date de dernière modif.
 
Enfin tu peux télécharger mon cours de shell ici http://fr.lang.free.fr/cours/Shell_v2.0.pdf. Tout le shell est expliqué. Tu y trouveras par exemple un script qui affiche une arborescence de façon récursive (un peu à la façon "tree" ) et d'autres exemples qui pourront t'aider pour faire ce devoir.
 
PS: Ce devoir n'est pas un devoir de débutant et demande quand-même un certain niveau de connaissances en shell. Tu es donc sensé avoir suivi un cours pour acquérir ces connaissances. Donc ne dis pas que t'as pas les compétences...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-03-2007 à 08:53:55    

Merci, je m'y colle et si j'ai des problèmes je post
@+

Reply

Marsh Posté le 20-03-2007 à 11:12:57    

Code :
  1. # Programme qui supprime LE plus vieux fichier d'un repertoire, si taille > taille max, et qui supprime les repertoires vides.
  2. # Et controle les extensions de fichers (.txt, .rar, .zip, .avi, .iso, .nfo, .xls, .ppt, .pdf, .doc)
  3. # Exclusions des repertoires /bin /dev /etc /lib...
  4. dossier="/ep10/home/kwado/franck/test/dossier"
  5. taille="50000" #egal 50 mega octet
  6. # taille de dossier
  7. vraitaille=$(du -sk "$dossier" | cut -f1)
  8. echo "La taille du dossier est $vraitaille"
  9. if  test "$vraitaille" -ge "$taille"
  10. then
  11. {
  12. echo "$vraitaille > $taille, suppression on"
  13. supp=1
  14. }
  15. fi
  16. # boucle sur les fichiers
  17. find $dossier |while read file
  18. do
  19. # pour chaque fichier
  20. # echo $file
  21. #Exclusions du repertoire /bin
  22. if [ `expr "$file" : "$dossier/bin/"` -ne 0 ]
  23.  then
  24.  {
  25.  echo "Passage du fichier $file"
  26.  continue
  27.  }
  28. fi
  29. if  test "$file" == "$dossier/bin"
  30.  then
  31.  {
  32.  echo "Passage du dossier $file"
  33.  continue
  34.  }
  35. fi
  36. #####################################Suppression des fichiers non valides
  37. ##################################### suppression des repertoires vides
  38. done
  39. if  test "$supp" == 1
  40. then
  41. {
  42. # suppression du fichier le plus vieux
  43. for file in `ls -ltr $dossier`
  44. #for file in `find . -type f | xargs ls -ltr`
  45. do
  46.   #Exclusions du repertoire /bin
  47.   if  test "$file" == "bin"
  48.    then
  49.    {
  50.    echo "Passage du dossier $file"
  51.    continue
  52.    }
  53.   fi
  54.   #test si c'est un repertoire
  55.   if test "$dossier/$file" == -d
  56.   then {
  57.    echo "$file est un répertoire, on avance"
  58.    # mettre un goto
  59.    }
  60.   fi
  61.   #si c'est un fichier on a gagne
  62.   if test "$dossier/$file" == -f 
  63.   then {
  64.    echo "$file est un fichier, on le supprime"
  65.    #commande de suppression
  66.    break
  67.    }
  68.   fi
  69.   #echo $dossier/$file
  70.   #break
  71. done
  72. }
  73. fi


 
Mon problème es que sur la deuxième boucle, le test fichier ou dossier n'est jamais vraie ?
et j'ai pas d'idée comment recuperé l'extension du fichier?
 
merci

Reply

Marsh Posté le 20-03-2007 à 12:57:15    

dd_pak a écrit :

Code :
  1. # Programme qui supprime LE plus vieux fichier d'un repertoire, si taille > taille max, et qui supprime les repertoires vides.
  2. # Et controle les extensions de fichers (.txt, .rar, .zip, .avi, .iso, .nfo, .xls, .ppt, .pdf, .doc)
  3. # Exclusions des repertoires /bin /dev /etc /lib...
  4. dossier="/ep10/home/kwado/franck/test/dossier"
  5. taille="50000" #egal 50 mega octet
  6. # taille de dossier
  7. vraitaille=$(du -sk "$dossier" | cut -f1)
  8. echo "La taille du dossier est $vraitaille"
  9. if  test "$vraitaille" -ge "$taille"
  10. then
  11. {
  12. echo "$vraitaille > $taille, suppression on"
  13. supp=1
  14. }
  15. fi
  16. # boucle sur les fichiers
  17. find $dossier |while read file
  18. do
  19. # pour chaque fichier
  20. # echo $file
  21. #Exclusions du repertoire /bin
  22. if [ `expr "$file" : "$dossier/bin/"` -ne 0 ]
  23.  then
  24.  {
  25.  echo "Passage du fichier $file"
  26.  continue
  27.  }
  28. fi
  29. if  test "$file" == "$dossier/bin"
  30.  then
  31.  {
  32.  echo "Passage du dossier $file"
  33.  continue
  34.  }
  35. fi
  36. #####################################Suppression des fichiers non valides
  37. ##################################### suppression des repertoires vides
  38. done
  39. if  test "$supp" == 1
  40. then
  41. {
  42. # suppression du fichier le plus vieux
  43. for file in `ls -ltr $dossier`
  44. #for file in `find . -type f | xargs ls -ltr`
  45. do
  46.   #Exclusions du repertoire /bin
  47.   if  test "$file" == "bin"
  48.    then
  49.    {
  50.    echo "Passage du dossier $file"
  51.    continue
  52.    }
  53.   fi
  54.   #test si c'est un repertoire
  55.   if test "$dossier/$file" == -d
  56.   then {
  57.    echo "$file est un répertoire, on avance"
  58.    # mettre un goto
  59.    }
  60.   fi
  61.   #si c'est un fichier on a gagne
  62.   if test "$dossier/$file" == -f 
  63.   then {
  64.    echo "$file est un fichier, on le supprime"
  65.    #commande de suppression
  66.    break
  67.    }
  68.   fi
  69.   #echo $dossier/$file
  70.   #break
  71. done
  72. }
  73. fi


 
Mon problème es que sur la deuxième boucle, le test fichier ou dossier n'est jamais vraie ?
et j'ai pas d'idée comment recuperé l'extension du fichier?
 
merci


 
Bon, à ta première boucle tu fais un "find |while read" => ok - Je ne sais pas si t'as pris cette idée chez-moi (et donc si t'as compris le principe) ou si tu connaissais déjà l'astuce.
Pourquoi, dans ta seconde boucle, tu ne fais pas pareil ? Style "find -type f |xargs ls -ltr | while read file" ???
Petite remarque en passant : La commande "find" peut recevoir une commande qu'elle appliquera automatiquement sur les fichiers qu'elle trouve. Autrement dit, tu peux remplacer "find -type f |xargs ls -ltr" par "find -type f -exec ls -ltr {} \;"
 
Ensuite, je ne comprends pas trop ce que tu cherches quand tu fais "if test $dossier/$file == -f" car si la variable "$file" récupère une ligne du "ls" (au fait, t'as oublié de sauter la première ligne du "ls" qui indique "total: xxx" ) alors il n'y aura jamais "-f" ou "-d". Si c'est un fichier normal il y aura "-" suivi des droits "rwxrwxrwx", si c'est un répertoire, il y aura "d" suivi des droits. Donc il te faudra extraire le premier caractère de "$file" et comparer ce premier caractère à "-" ou à "d" mais sûrement pas "-f" ni "-d".
De toute façon, c'est une méthode bien compliquée pour déterminer le type du fichier alors que t'as "test -d". Ah, ça y est, j'ai compris. Tu as cru que dans la commande "test" il fallait mettre "test fichier = -d". Non, l'option "-d" ou "-f" sont des options de la commande "test" donc il faut les mettre avant
=> test -f "$dossier/$file"
=> test -d "$dossier/$file"
Bien entendu, il faut que "$file" ne récupère que le nom du fichier et pas les informations au format "long" donc faut enlever l'option "-l" du "ls"...
 
Comment récupérer une extension ? Un extension est une chaîne qui suit un ".". Donc tu peux utiliser la commande "cut" en coupant sur le ".". Exemple:
nom="toto.doc"
base=`echo $nom |cut -f1 -d.`           => base="toto"
ext=`echo $nom |cut -f2 -d.`             => ext="doc"
 
Maintenant, si le nom possède plusieurs extensions, style "toto.tar.gz", alors ça devient plus compliqué et ça dépend de ta façon de voir. Si tu considères que l'extension est "tar.gz" alors ma méthode marche encore ; si tu considères que c'est "gz" alors ça devient plus compliqué (faut compter les "." puis ne prendre que le dernier) et si tu veux récupérer et isoler chaque extension ("tar", "gz" ) alors il faut faire une boucle.
 
Petites remarques en pasant:

  • goto n'existe pas en shell...
  • 50000 ko ne font pas 50 Mo - 50 Mo = 50 * 1024 ko soit 51200 ko soit 51200 * 1024 o = 52428800 octets - Il n'y a que les constructeurs de disques qui font semblant de ne pas le savoir...


Message édité par Sve@r le 20-03-2007 à 13:10:16

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 20-03-2007 à 14:59:01    

Code :
  1. nom="toto.tar.gz"
  2.     point=`expr "$nom" : .`
  3.     echo $point
  4.     base=`echo $nom |cut -f1 -d.`         
  5.     ext=`echo $nom |cut -f2 -d.`   
  6.     echo $base
  7.     echo $ext


 
Pour la taille, merci mais je me doute que c'est approximatif, je connais cette règle
Pour le test --d et -f, j'ai trouvé il faut un espace derrière sinon ca ne marche pas
Pour l'extension je dirais .tar.gz => c'est un gz
Donc il faut compter le nombre de point pour le cut mais je n'y arrive pas, il me renvoie 0 ou 1 mais pas 2?
 
Je te remercie pour ton aide, oui je me suis inspriré de tes conseils, je code mais la c'est mon premier script shell alors j'ai un peu de mal
merci @+

Reply

Marsh Posté le 20-03-2007 à 17:07:43    

dd_pak a écrit :

Code :
  1. nom="toto.tar.gz"
  2.     point=`expr "$nom" : .`
  3.     echo $point
  4.     base=`echo $nom |cut -f1 -d.`         
  5.     ext=`echo $nom |cut -f2 -d.`   
  6.     echo $base
  7.     echo $ext


 
Pour la taille, merci mais je me doute que c'est approximatif, je connais cette règle
Pour le test --d et -f, j'ai trouvé il faut un espace derrière sinon ca ne marche pas
Pour l'extension je dirais .tar.gz => c'est un gz
Donc il faut compter le nombre de point pour le cut mais je n'y arrive pas, il me renvoie 0 ou 1 mais pas 2?


 
Ben si tu regardes bien le "cut", je demande le "-f2" c.a.d. le champ n° 2 (sous-entendu "séparé du champ "1" par un "." ) en ayant présumé que le nom n'avait que 2 champs.
Maintenant, si le nom a plusieurs "." non connus à l'avance, il y a plusieurs solutions mais à mon avis, la plus simple est de filtrer le nom par un "awk"
nom="toto.tar.gz"
ext=`echo $nom |awk -F. '{print $NF}' `        => ext="gz"
Explication: chaque ligne traitée par "awk" contient dans sa variable "NF" le nombre de champs de la ligne en question (le séparateur de champs étant indiqué par le "-F" donc ce sera "." ). Donc en affichant la variable "$NF" (qui est une variable spécifique au langage "awk" ), j'affiche le texte correspondant au dernier champ et ce, quel que soit le nombre de champs du flux entrant.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 21-03-2007 à 09:51:44    

Merci mon script et enfin fini, merci pour ton aide je crois pas que j'aurais reussi tout seul
Je suis consient que l'on peut l'ameliorer mais pour le moment ca me suffit
Voici le code ca peut toujours servir à quelq'un.
Encore merci pour ton aide et tes explications
 

Code :
  1. # Programme qui supprime LE plus vieux fichier d'un repertoire, si taille > taille max, et qui supprime les repertoires et fichiers vides.
  2. # Et controle les extensions de fichers (.txt, .rar, .zip, .avi, .iso, .nfo, .xls, .ppt, .pdf, .doc)
  3. # Exclusions des repertoires /bin /dev /etc /lib...
  4. # Renome les fichiers avec espace acents...
  5. dossier="/ep10/home/kwado/franck/test/dossier"
  6. taille="50000" #egal-environ 50 mega octet
  7. # Affiche la date pour le log
  8. DATE=`date +"%Hh%M"`
  9. DATE2=`date +"%d/%m"`
  10. echo "Lancé à $DATE le $DATE2"
  11. # Renome les fichiers zarbi...:)
  12. find $dossier |while read file
  13. do
  14.    file_mod=`echo "$file" | tr '[àâäéèêëîïôöùûü ]' '[aaaeeeeiioouuu_]' | sed -e "s/'/_/g"`
  15.    if test "$file" != "$file_mod"
  16. then
  17. {
  18. echo "$file devient $file_mod"
  19. mv "$file" "$file_mod"
  20. }
  21.    fi
  22. done
  23. #################FONCTION
  24. old(){
  25. dossier=$1
  26. if  test "$supp" == 1
  27. then
  28. {
  29. # suppression du fichier le plus vieux
  30. for file in `ls -latrC $dossier`
  31. #for file in `find . -type f | xargs ls -ltr`
  32. do
  33.   #Exclusions du repertoire /bin
  34.   if  test "$file" == "bin"
  35.    then
  36.    {
  37.    echo "Passage du dossier $file"
  38.    continue
  39.    }
  40.   fi
  41.   if  test "$file" == "."
  42.    then
  43.    {
  44.    echo "Passage du dossier $file"
  45.    continue
  46.    }
  47.   fi
  48.   if  test "$file" == ".."
  49.    then
  50.    {
  51.    echo "Passage du dossier $file"
  52.    continue
  53.    }
  54.   fi
  55.   #test si c'est un repertoire
  56.   if test -d $dossier/$file
  57.   then {
  58.    echo "$file est un répertoire, on avance"
  59.    # mettre un goto
  60.    dossier=$dossier/$file
  61.    old $dossier
  62.    }
  63.   fi
  64.   #si c'est un fichier on a gagne
  65.   if test -f $dossier/$file 
  66.   then {
  67.    echo "$file est un fichier, on le supprime car il est le plus vieux"
  68.    #commande de suppression
  69.    rm $dossier/$file
  70.    break
  71.    }
  72.   fi
  73.   #echo $dossier/$file
  74.   #break
  75. done
  76. }
  77. fi
  78. }
  79. ###########################PROGRAMME
  80. # taille de dossier
  81. vraitaille=$(du -sk "$dossier" | cut -f1)
  82. echo "La taille du dossier est $vraitaille"
  83. if  test "$vraitaille" -ge "$taille"
  84. then
  85. {
  86. echo "$vraitaille > $taille, suppression on"
  87. supp=1
  88. }
  89. fi
  90. # boucle sur les fichiers
  91. find $dossier |while read file
  92. do
  93. # pour chaque fichier
  94. # echo $file
  95. #Exclusions du repertoire /bin
  96. if [ `expr "$file" : "$dossier/bin/"` -ne 0 ]
  97.  then
  98.  {
  99.  echo "Passage du fichier $file"
  100.  continue
  101.  }
  102. fi
  103. if  test "$file" == "$dossier/bin"
  104.  then
  105.  {
  106.  echo "Passage du dossier $file"
  107.  continue
  108.  }
  109. fi
  110. # suppression fichiers vides
  111. if test -f $file 
  112.   then {
  113.    if ! test -s $file
  114.     then {
  115.     echo "$file est un fichier vide on le supprime"
  116.     #commande de suppression
  117.     rm $file
  118.     }
  119.    fi
  120.    }
  121. fi
  122. done
  123. #suppression des dossiers vides
  124. find $dossier -type d -empty -delete
  125. #Verification des extensions
  126. find $dossier |while read file
  127. do
  128. #Exclusions du repertoire /bin
  129. if [ `expr "$file" : "$dossier/bin/"` -ne 0 ]
  130.  then
  131.  {
  132.  #echo "Passage du fichier $file"
  133.  continue
  134.  }
  135. fi
  136. #on ne verifie que les fichiers
  137. if test -f $file 
  138.  then {
  139.  ext=1
  140.  extf=`echo $file |awk -F. '{print $NF}' `
  141.  #echo $extf
  142.  if test "$extf" == "gz" || test "$extf" == "txt"
  143.   then
  144.   {
  145.   ext=0
  146.   }
  147.  fi
  148.  if  test "$ext" == 1
  149.   then
  150.   {
  151.   echo "Suppression de $file mauvaise extension"
  152.   rm $file
  153.   }
  154.  fi
  155.  }
  156. fi
  157. done
  158. #lancement de la fonction
  159. old $dossier

Reply

Marsh Posté le 21-03-2007 à 12:53:28    

dd_pak a écrit :

Merci mon script et enfin fini, merci pour ton aide je crois pas que j'aurais reussi tout seul
Encore merci pour ton aide et tes explications


It's my job...
 

dd_pak a écrit :

# Affiche la date pour le log
DATE=`date +"%Hh%M"`
DATE2=`date +"%d/%m"`
echo "Lancé à $DATE le $DATE2"



Petit danger: les variables en majuscules sont réservées au système. Imagine que, sans le savoir, tu aies utilisé la variable "PATH" ou "HOME" ??? Ben c'est pareil. Tu ne sais pas si le système n'utilise pas, pour lui, "DATE". Evidemment c'est improbable mais c'est pour le principe. Et puis un nom en minuscule est souvent plus lisible...
Sinon amélioration rapide:

# Affiche la date pour le log
echo "Lancé à `date +'%Hh%M'` le `date +'%d/%m'`"


 

dd_pak a écrit :

Code :
  1. # Renome les fichiers zarbi...:)
  2. find $dossier |while read file
  3. do
  4.    file_mod=`echo "$file" | tr '[àâäéèêëîïôöùûü ]' '[aaaeeeeiioouuu_]' | sed -e "s/'/_/g"`
  5.    if test "$file" != "$file_mod"
  6. then
  7. {
  8. echo "$file devient $file_mod"
  9. mv "$file" "$file_mod"
  10. }
  11.    fi
  12. done
  13. #################FONCTION
  14. old(){
  15. dossier=$1
  16. if  test "$supp" == 1
  17. then
  18. {
  19. # suppression du fichier le plus vieux
  20. for file in `ls -latrC $dossier`
  21. #for file in `find . -type f | xargs ls -ltr`
  22. do
  23.   #Exclusions du repertoire /bin
  24.   if  test "$file" == "bin"
  25.    then
  26.    {
  27.    echo "Passage du dossier $file"
  28.    continue
  29.    }
  30.   fi
  31.   if  test "$file" == "."
  32.    then
  33.    {
  34.    echo "Passage du dossier $file"
  35.    continue
  36.    }
  37.   fi
  38.   if  test "$file" == ".."
  39.    then
  40.    {
  41.    echo "Passage du dossier $file"
  42.    continue
  43.    }
  44.   fi
  45.   #test si c'est un repertoire
  46.   if test -d $dossier/$file
  47.   then {
  48.    echo "$file est un répertoire, on avance"
  49.    # mettre un goto
  50.    dossier=$dossier/$file
  51.    old $dossier
  52.    }
  53.   fi
  54.   #si c'est un fichier on a gagne
  55.   if test -f $dossier/$file 
  56.   then {
  57.    echo "$file est un fichier, on le supprime car il est le plus vieux"
  58.    #commande de suppression
  59.    rm $dossier/$file
  60.    break
  61.    }
  62.   fi
  63.   #echo $dossier/$file
  64.   #break
  65. done
  66. }
  67. fi
  68. }
  69. ###########################PROGRAMME
  70. # taille de dossier
  71. vraitaille=$(du -sk "$dossier" | cut -f1)
  72. echo "La taille du dossier est $vraitaille"
  73. if  test "$vraitaille" -ge "$taille"
  74. then
  75. {
  76. echo "$vraitaille > $taille, suppression on"
  77. supp=1
  78. }
  79. fi
  80. # boucle sur les fichiers
  81. find $dossier |while read file
  82. do
  83. # pour chaque fichier
  84. # echo $file
  85. #Exclusions du repertoire /bin
  86. if [ `expr "$file" : "$dossier/bin/"` -ne 0 ]
  87.  then
  88.  {
  89.  echo "Passage du fichier $file"
  90.  continue
  91.  }
  92. fi
  93. if  test "$file" == "$dossier/bin"
  94.  then
  95.  {
  96.  echo "Passage du dossier $file"
  97.  continue
  98.  }
  99. fi
  100. # suppression fichiers vides
  101. if test -f $file 
  102.   then {
  103.    if ! test -s $file
  104.     then {
  105.     echo "$file est un fichier vide on le supprime"
  106.     #commande de suppression
  107.     rm $file
  108.     }
  109.    fi
  110.    }
  111. fi
  112. done
  113. #suppression des dossiers vides
  114. find $dossier -type d -empty -delete
  115. #Verification des extensions
  116. find $dossier |while read file
  117. do
  118. #Exclusions du repertoire /bin
  119. if [ `expr "$file" : "$dossier/bin/"` -ne 0 ]
  120.  then
  121.  {
  122.  #echo "Passage du fichier $file"
  123.  continue
  124.  }
  125. fi
  126. #on ne verifie que les fichiers
  127. if test -f $file 
  128.  then {
  129.  ext=1
  130.  extf=`echo $file |awk -F. '{print $NF}' `
  131.  #echo $extf
  132.  if test "$extf" == "gz" || test "$extf" == "txt"
  133.   then
  134.   {
  135.   ext=0
  136.   }
  137.  fi
  138.  if  test "$ext" == 1
  139.   then
  140.   {
  141.   echo "Suppression de $file mauvaise extension"
  142.   rm $file
  143.   }
  144.  fi
  145.  }
  146. fi
  147. done
  148. #lancement de la fonction
  149. old $dossier



 
Petites remarques mineures
1) en général, une fonction est écrite en premier car on considère qu'on pourrait avoir à s'en servir de partout. Imagines que t'aies à t'en servir lors du renommage des fichiers zarbi, ben tu pourrais pas.
2) je ne comprends pas à quoi sert la variable "supp" dans ta fonction. Tu testes si elle est à "1" mais sinon tu ne fais rien. Autant ne pas appeler "old" si ce n'est pas utile. Par ailleurs, si vraiment ta fonction "old" devait recevoir un paramètre à "1", autant le lui passer directement comme paramètre justement et non pas par le biais d'une variable venue du dehors. Si dans ton code principale il te prend l'envie de modifier le nom "supp" en autre chose, faudra reporter cette modif dans la fonction !!!
3) je ne comprends pas trop pourquoi tu mets l'option "-l" dans ton "ls" ce qui t'oblige à mettre l'option "C" sinon t'aurais un affichage au format long. Autant faire un "ls -atr" ou, au pire, si t'es pas sûr de toi, un "ls -atr1" qui force l'affichage à n'être que sur une seule colonne...
4) une fonction ne travaille pas sur une copie des variables mais sur les variables elle-mêmes ça c'est très dangereux. Dans ta fonction "old" tu utilises les variables "$dossier" et "$supp" et "$file". Tu utilises aussi ces mêmes variables dans ton code principal.
Imagines que t'aies un truc de ce style

for $file in truc
do
      old $file
      <...>
      traitement suivant sur $file
done


Ben le passe par "old" a écrasé le "$file" par celui qui est dans "old". Et ton traitement suivant plante.
 
Pour éviter ce danger, toujours mettre ton code de fonction entre parenthèses - Ca ne change pas l'accès aux valeurs des variables mais ce ne sont que des copies et les originaux ne sont pas modifiés
 

old(){
(
 dossier=$1
 if  test "$supp" == 1
 then
  # suppression du fichier le plus vieux
  for file in `ls -atr $dossier`
  do
   #Exclusions du repertoire /bin, "." et ".."
   if  test "$file" == "bin" -o "$file" = "." -o "$file" = ".."
   then
    echo "Passage du dossier $file"
    continue
   fi
   #test si c'est un repertoire
   if test -d $dossier/$file
   then
    echo "$file est un répertoire, on entre dedans"
    old $dossier/$file
   fi
   #si c'est un fichier on a gagne
   if test -f $dossier/$file  
   then
    echo "$file est un fichier, on le supprime car il est le plus vieux"
    #commande de suppression
    rm -f $dossier/$file
    break
   fi
   #echo $dossier/$file
   #break
  done
 fi
)
}


 
PS: Les accolades dans les corps des structures for/if/while ne sont pas obligatoires. Les mots clefs "then/else/fi/do/done" permettent au shell de se repérer dans le code. Sinon j'aime bien ton script. On sent que t'es à l'aise dans la syntaxe shell et t'as bien pigé la récursivité (ta fonction "old" qui s'appelle elle-même). Le reste viendra avec le temps...


Message édité par Sve@r le 21-03-2007 à 13:10:02

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 21-03-2007 à 14:30:48    

Citation :

On sent que t'es à l'aise dans la syntaxe shell


 
Merci encore, je corrige tout les petites remarques, sinon non je suis pas à l'aise c'est pour ca que tu m'a aidé, c'est mon premier script...
mais je code en perl,php,sql,javascript,html donc ca aide

Reply

Sujets relatifs:

Leave a Replay

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