Ce script ne veut pas fonctionner

Ce script ne veut pas fonctionner - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 14-02-2004 à 21:26:59    

Bon, c'est le dernier....
 
Qu'est-ce qui marche pas dans ce foutu script.... :pfff:  
 
Tu rentre la valeur et le dossier et il affiche tous les fichiers qui dépasse la valeur dans le dossier...
 

Code :
  1. #!/bin/bash
  2. echo "Taille min des fichiers a afficher : " $1
  3. echo "dans le repertoire                 : " $2
  4. echo
  5. rm -rf temp
  6. ls -lS $2 | cut -b39-50,57- >> temp
  7. while read ligne
  8. do
  9.            taille=`echo $ligne | cut -f1 -d' '`
  10.            fichier=`echo $ligne | cut -f4 -d' '`
  11.            date=`echo $ligne | cut -f2 -d' '`
  12.            mois=`echo $ligne | cut -f3 -d' '`
  13. for i in $2; do
  14. if [ -f $i ]; then
  15. if [ ${taille} -gt ${1} ];then
  16. echo -e "$fichier $date $mois $taille"
  17. fi
  18. fi
  19. done
  20. done <temp


Reply

Marsh Posté le 14-02-2004 à 21:26:59   

Reply

Marsh Posté le 14-02-2004 à 21:30:33    

Messages d'erreurs ?


---------------
-~- Libérez Datoune ! -~- Camarade, toi aussi rejoins le FLD pour que la flamme de la Révolution ne s'éteigne pas ! -~- A VENDRE
Reply

Marsh Posté le 14-02-2004 à 21:34:19    

Si je laisse le "if" qui teste si c'est un fichier, j'ai aucun message d'erreur mais il liste rien
 
Si j'enlève ce "if", il liste ce que je veux, mais AUSSI les dossiers, et ca il ne faudrait pas. En plus il me faire un "unary error expected"...Pourtant je compare bien 2 valeures qui se compare...
 
Je suis tellement concentré dedans que je n'y vois plus rien...

Reply

Marsh Posté le 14-02-2004 à 23:31:31    

Execute ton script avec affichage des commandes exécutées et analyse se qui se passe.
 
bash -x the_script taille rep 2>&1 | more


---------------
Jean Pierre.
Reply

Marsh Posté le 15-02-2004 à 00:06:04    

Peut être que mon code ne fait pas ce que je pense qu'il doit faire...
 
 

Code :
  1. [---------------------]$ bash -x t.sh 40 coco
  2. + echo 'Taille min des fichiers a afficher : ' 40
  3. Taille min des fichiers a afficher :  40
  4. + echo 'dans le repertoire                 : ' coco
  5. dans le repertoire                 :  coco
  6. + echo
  7. + rm -rf temp
  8. + ls -lS coco
  9. + cut -b39-50,57-
  10. + read ligne
  11. ++ echo
  12. ++ cut -f1 '-d '
  13. + taille=
  14. ++ echo
  15. ++ cut -f4 '-d '
  16. + fichier=
  17. ++ echo
  18. ++ cut -f2 '-d '
  19. + date=
  20. ++ echo
  21. ++ cut -f3 '-d '
  22. + mois=
  23. + '[' -f coco ']'
  24. + read ligne
  25. ++ echo 4096 Feb 14 sub
  26. ++ cut -f1 '-d '
  27. + taille=4096
  28. ++ echo 4096 Feb 14 sub
  29. ++ cut -f4 '-d '
  30. + fichier=sub
  31. ++ echo 4096 Feb 14 sub
  32. ++ cut -f2 '-d '
  33. + date=Feb
  34. ++ echo 4096 Feb 14 sub
  35. ++ cut -f3 '-d '
  36. + mois=14
  37. + '[' -f coco ']'
  38. + read ligne
  39. ++ echo 12 Feb 14 goe
  40. ++ cut -f1 '-d '
  41. + taille=12
  42. ++ echo 12 Feb 14 goe
  43. ++ cut -f4 '-d '
  44. + fichier=goe
  45. ++ echo 12 Feb 14 goe
  46. ++ cut -f2 '-d '
  47. + date=Feb
  48. ++ echo 12 Feb 14 goe
  49. ++ cut -f3 '-d '
  50. + mois=14
  51. + '[' -f coco ']'
  52. + read ligne
  53. [------------------]$ bash t.sh 40 coco
  54. Taille min des fichiers a afficher :  40
  55. dans le repertoire                 :  coco
  56. [------------------]$

Reply

Marsh Posté le 15-02-2004 à 06:20:08    

Je l'ai modifié un peu mais ca donne pas encore le résultat escompté....
 
-Il ne doit pas lister les répertoires, juste les fichiers
-Il me fait cette erreur
-J'arrive pas à le formater
 

Code :
  1. #!/bin/bash
  2. echo "Taille min des fichiers a afficher : " $1
  3. echo "dans le repertoire                 : " $2
  4. echo
  5. rm -rf temp
  6. #ls -lS $2 | cut -b39-50,57- >> temp
  7. ls -lS $2 >> temp
  8. while read ligne
  9. do
  10.            taille=`echo $ligne | cut -f 5 -d' '`
  11.            fichier=`echo $ligne | cut -f 9 -d' '`
  12.            date=`echo $ligne | cut -f 7 -d' '`
  13.            mois=`echo $ligne | cut -f 6 -d' '`
  14. #for i in $2; do
  15. #if [ -f "$i" ]; then
  16. if [ ${taille} -gt ${1} ];then
  17. echo -e "\t$fichier\t$date\t$mois$taille"
  18. fi
  19. #fi
  20. #done
  21. done <temp
  22. #fin
  23. [--------@--------]$ bash t.sh 60 coco
  24. Taille min des fichiers a afficher :  60
  25. dans le repertoire                 :  coco
  26. t.sh: line 19: [: -gt: unary operator expected
  27.         sub     14      Feb4096
  28.         tp1no5.sh       14      Feb996
  29.         t.sh    14      Feb492
  30.         coloce  14      Feb166
  31. [--------@--------]$

Reply

Marsh Posté le 15-02-2004 à 07:44:55    

tu veux du récursif aussi, c'est à dire lister les fichiers des sous-répertoires aussi ?

Reply

Marsh Posté le 15-02-2004 à 08:26:07    

bon, avec du récursif :
 


#!/bin/sh
 
taille=$1
rep="$2"
 
[ "$1" = "" ] && read -p "Entrer la taille maximale en octet : " taille || echo "Taille maximale en octet : $taille"
[ "$2" = "" ] && read -p "Entrer le répertoire racine à lister : " rep || echo "Répertoire racine à lister : $rep"
 
count=0
echo
for i in `find "$rep" -type f`
   do
      tf=`du -b $i | cut -f1 -d'/'`
      [ $tf -gt $taille ] && count=`expr $count + 1` && echo "$i : $tf"
   done
 
[ $taille -gt 1 ] && s="s "
[ $count -gt 1 ] && ss="s"
 
echo
echo "Nombre de fichier$ss dans '$rep' dont la taille est supérieure à $taille octet$s: $count"
echo


 
résultat :


<-=[ ~/test-scripts ]=-> ./test
Entrer la taille maximale en octet : 500000
Entrer le répertoire racine à lister : /tmp
 
/tmp/kde-bmo/ksycoca : 1052672
/tmp/coreutils_5.0.91-2_i386.deb : 2449408
/tmp/coreutils-5.1.2-1mdk.i586.rpm : 2244608
/tmp/coreutils-5.0.91.tgz : 2461696
/tmp/coreutils-5.1.2.tgz : 2252800
 
Nombre de fichiers  dans /tmp dont la taille est supérieure à 500000 octets : 5


Message édité par BMOTheKiller le 15-02-2004 à 08:46:38
Reply

Marsh Posté le 15-02-2004 à 10:03:59    

_Faust_, je pense que ton problème vient des 'cut'.Dasn le résultat de la commande 'ls' les colonnes sont séparées par plusieurs espaces et pour cut chaque espace délimite un champ (ce n'est pas comme pour le shell).


-rwxr-xr-x    1 jp mkgroup        36 Feb  6 19:43 a.aw
^f1           ^f5


Tu te retrouves avec taille="", ce qui te donne pour le test
if [ -gt val$1 ]; then
d'où le pb de -gt: unary operator expected  
 
Il vaut mieux mettre les opérandes entre guillemets dans le test
if [ "${taille}" -gt "${1}" ]; then
 
Il vaut mieux utiliser 'read' pour décomposer la ligne.
De plus comme tu liste les fichiers par ordre décroissant (-S),
tu peux arrêter de tester dés que tu tu rencontres un fichier plus petit.
[/fixed]
ls -lS $2 | \  
while read perms hlinks owner group taille date mois fichier  
do  
   if [ "${taille}" -gt "${1}" ]
   then  
      echo -e "\t$fichier\t$date\t$mois$taille"  
   else
      break    
   fi  
done
[/fixed]


---------------
Jean Pierre.
Reply

Marsh Posté le 15-02-2004 à 10:05:11    

aigles a écrit :

_Faust_, je pense que ton problème vient des 'cut'.Dasn le résultat de la commande 'ls' les colonnes sont séparées par plusieurs espaces et pour cut chaque espace délimite un champ (ce n'est pas comme pour le shell).


-rwxr-xr-x    1 jp mkgroup        36 Feb  6 19:43 a.aw
^f1           ^f5


Tu te retrouves avec taille="", ce qui te donne pour le test
if [ -gt val$1 ]; then
d'où le pb de -gt: unary operator expected  
 
Il vaut mieux mettre les opérandes entre guillemets dans le test
if [ "${taille}" -gt "${1}" ]; then
 
Il vaut mieux utiliser 'read' pour décomposer la ligne.
De plus comme tu liste les fichiers par ordre décroissant (-S),
tu peux arrêter de tester dés que tu tu rencontres un fichier plus petit.


ls -lS $2 | \  
while read perms hlinks owner group taille date mois date3 fichier  
do  
   if [ "${taille}" -gt "${1}" ]
   then  
      echo -e "\t$fichier\t$date\t$mois$taille"  
   else
      break    
   fi  
done


 


---------------
Jean Pierre.
Reply

Marsh Posté le 15-02-2004 à 10:05:11   

Reply

Marsh Posté le 15-02-2004 à 17:27:40    

aigles, ca marche ceci chez toi ou il y a qq chose que je n'ai pas compris?
 

Code :
  1. #!/bin/bash
  2.   echo "Taille min des fichiers a afficher : " $1
  3.   echo "dans le repertoire                 : " $2
  4.   echo
  5. ls -lS $2 | \
  6. while read perms hlinks owner group taille date mois date3 fichier
  7. do
  8.    if [ "${taille}" -gt "${1}" ]
  9.    then
  10.       echo -e "\t$fichier\t$date\t$mois$taille"
  11.    else
  12.       break
  13.    fi
  14. done
  15.   #fin


 

Reply

Marsh Posté le 15-02-2004 à 19:06:25    

Désolé, ça ne marche effectivement pas, 'read' ne semble pas capable de lire des données depuis un pipe (avec ksh pas de pb).
 
Voila donc une nouvelle version du script:

Code :
  1. #!/usr/bin/bash
  2. echo "Taille min des fichiers a afficher : " $1
  3. echo "dans le repertoire                 : " $2
  4. echo
  5. ls -lS $2 | tail +2 > $$.tmp
  6. while read perms hlinks owner group taille date mois date3 fichier
  7. do
  8.    if [ "${taille}" -gt "${1}" ]
  9.    then
  10.       echo -e "\t$fichier\t$date\t$mois$taille"
  11.    else
  12.       break
  13.    fi
  14. done < $$.tmp
  15. rm -f $$.tmp


---------------
Jean Pierre.
Reply

Marsh Posté le 15-02-2004 à 22:08:06    

bon, grâce à vous ca très bien. J'ai changé quelques trucs pour le peaufiner, et j'ai fais une boucle pour ne pas lister les dossiers.  
 
D'ailleurs, c'est la seule facon que j'ai trouvé pour ne pas lister les dossiers, mais je me demandais si c'était "de la programmation conforme" ou si c'est inhabituel.
 

Code :
  1. #!/usr/bin/bash
  2. min=${1:?"Vous devez specifiez la taille minimum"}
  3. folder=${2:?"Specifiez un dossier"}
  4.   echo -e "\nTaille min des fichiers a afficher : " $min
  5.   echo "dans le repertoire                 : " $folder
  6.   echo
  7.   if [ ! -d $folder ]
  8.   then
  9.   echo "$folder n'est pas un dossier"
  10. else
  11.   ls -lS $folder | tail +2 > $$.tmp
  12.   while read perms hlinks owner group taille date mois date3 fichier
  13.   do
  14.      if [ "${taille}" -gt "${min}" ]
  15.      then
  16.       if  [ "$perms" != "drwx------" ]
  17. then
  18.         echo -e "\t$fichier   \t\t$date $mois\t\t$taille"
  19.     fi
  20. else
  21.           break
  22.      fi
  23.   done < $$.tmp
  24. fi
  25.   rm -f $$.tmp


Message édité par _Faust_ le 15-02-2004 à 22:11:58
Reply

Marsh Posté le 16-02-2004 à 13:08:37    

Tu ne devrais pas tester de cette façon si le fichier est un répertoire.
Les permissions sur le répertoires ne sont pas obligatoirement "drwx------", par contre cela commence toujours par "d". Il suffit fonc d'éliminer les fichiers pour lesquels perms commence par "d" :

Code :
  1. ls -lS $folder | tail +2 > $$.tmp
  2. while read perms hlinks owner group taille date mois date3 fichier
  3. do 
  4.    [[ "$perms" =  d* ]] && continue
  5.    [[ "${taille}" -gt "${min}" ]] && break
  6.    echo -e "\t$fichier   \t\t$date $mois\t\t$taille"
  7. done < $$.tmp


---------------
Jean Pierre.
Reply

Sujets relatifs:

Leave a Replay

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