obtenir les fichiers d'un répertoire en shell

obtenir les fichiers d'un répertoire en shell - Shell/Batch - Programmation

Marsh Posté le 14-12-2006 à 17:52:30    

bonjour,
je possède ce code :

Code :
  1. cpt=0
  2. for i in `find $repertoire -type f`
  3. do
  4.   echo $i
  5.   files[$cpt]=`echo $i`
  6.   cpt=$(($cpt+1))
  7. done


qui est sensé récupéré tous les fichier d'un répertoire dans un tableau et par la même occasion les affichiers (les fichiers)
seulement j'ai remarqué que si le fichier contient des espaces, ceux ci sont considéré comme de retours chariot...
 
comment je peux faire pour éviter cela?
 
merci


---------------
dam's (debianer), ma galerie Flickr
Reply

Marsh Posté le 14-12-2006 à 17:52:30   

Reply

Marsh Posté le 15-12-2006 à 14:59:02    

utilise la fonction read

Reply

Marsh Posté le 15-12-2006 à 15:23:31    

ligne 5:


files[$cpt]="$i"

Reply

Marsh Posté le 15-12-2006 à 16:45:16    

files[$cpt]="$i"  ne change rien :'(
la fonction read s'utilise à la place de mon find?

Reply

Marsh Posté le 17-12-2006 à 15:45:30    

la fonction read permet de récupéré des informations tapées au clavier
je vois pas trop comment l'utiliser dans mon cas
 
merci de votre aide

Reply

Marsh Posté le 17-12-2006 à 17:44:35    

Code :
  1. find $repertoire -type f | while read LINE
  2. do
  3. echo "ligne lue = $LINE"
  4. done


Message édité par couak le 17-12-2006 à 17:45:36
Reply

Marsh Posté le 17-12-2006 à 23:24:06    

cette solution à l'aire de marcher, je vais la tester un peu plus
merci en tout cas!

Reply

Marsh Posté le 18-12-2006 à 19:18:49    

bonsoir,
alors voila le script "amélioré"

Code :
  1. find $rep -type f | while read LINE
  2. do
  3.   wall[$cpt]=`echo $LINE`
  4.   cpt=$(($cpt+1))
  5. done
  6. echo $cpt


 
seulement l'affichage de mon cpt renvoi 0 , alors que si je fais un   echo cpt=$(($cpt+1)) à chaque appel du while je vois bien le cpt s'incrémenté...
 
merci de votre aide (je suis débutant en shell, donc c'est peut etre sur la forme que je butte...)

Reply

Marsh Posté le 18-12-2006 à 23:55:30    

Citation :

seulement l'affichage de mon cpt renvoi 0 , alors que si je fais un   echo cpt=$(($cpt+1)) à chaque appel du while je vois bien le cpt s'incrémenté...


 
pour que le shell effectue un calcul numerique je crois qu'il faut un 'let' devant
 

Code :
  1. let cpt=$cpt+1

Reply

Marsh Posté le 19-12-2006 à 07:56:32    

j'ai une question bête : pourquoi tu t'embêtes à mettre dans une variable tableau ? c'est vrai le shell c'est plutôt pour faire des trucs rapides, avec des commandes encapsulées

Reply

Marsh Posté le 19-12-2006 à 07:56:32   

Reply

Marsh Posté le 19-12-2006 à 18:54:49    

dams78 a écrit :

la fonction read permet de récupéré des informations tapées au clavier  
je vois pas trop comment l'utiliser dans mon cas


En fait, le programme "read" (et non la fonction) récupère toute info dans l'entrée standard. Mais rien ne t'empêche de rediriger cette entrée à partir d'autre chose
Ex:

read a </etc/passwd
echo $a    # => tu obtiens tout le contenu de "/etc/passwd"


 
Donc dans la syntaxe "flux quelconque |while read LINE do; ... done", le shell commence par mettre le flux entier dans le pipe, puis le while entre en jeu et lance le read qui lit l'entrée standard (le pipe). Il s'arrête au premier "return" (première ligne) et charge cette ligne dans la variable "LINE" que tu traiteras dans la boucle pendant que le pipe est vidé de ce qui a été lu. Puis ça recommence et tu lis la seconde ligne etc jusqu'à la fin. A la fin, le pipe étant vide, le "read" renvoie "faux" et le "while" s'arrête.
Ce principe est courament utilisé pour traiter n'importe quel flux entrant ligne par ligne...
 

dams78 a écrit :

bonsoir,
alors voila le script "amélioré"

Code :
  1. find $rep -type f | while read LINE
  2. do
  3.   wall[$cpt]=`echo $LINE`
  4.   cpt=$(($cpt+1))
  5. done
  6. echo $cpt


 
seulement l'affichage de mon cpt renvoi 0 , alors que si je fais un   echo cpt=$(($cpt+1)) à chaque appel du while je vois bien le cpt s'incrémenté...
 
donc c'est peut etre sur la forme que je butte...)


 
Tu ne buttes absolument pas sur la forme. Ton shell est parfaitement écrit. Le pb, c'est que ton pipe (| while read ...) te génère un sous processus qui disparait en fin de done. Ton sous-processus disparait ainsi que toutes ses variables modifiées.
Pour t'en sortir, il faut grouper le while et le echo avec des parenthèses (qui servent à grouper différentes commandes dans un même processus)

Code :
  1. find $rep -type f | ( while read LINE
  2. do
  3.   wall[$cpt]=`echo $LINE`
  4.   cpt=$(($cpt+1))
  5. done
  6. # Ici, on est toujours dans le même processus grâce aux parenthèses
  7. echo $cpt)
  8. # Ici, on a quitté le sous-processus - cpt vaut la valeur du départ
  9. echo $cpt


 

dams78 a écrit :

merci de votre aide (je suis débutant en shell)


Tuto de shell en français ici: http://fr.lang.free.fr/cours/Shell_v1.4.pdf
 

dams78 a écrit :

Code :
  1. wall[$cpt]=`echo $LINE`



 
Petit détail:  

machin=`echo truc`


Se remplace avantageusement par

machin=truc


Message édité par Sve@r le 19-12-2006 à 19:59:44

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

Marsh Posté le 20-12-2006 à 21:06:38    

nikel ca marche
merci de votre aide!!!

Reply

Sujets relatifs:

Leave a Replay

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