Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/06/2007, 16h12   #1
Membre chevronné
 
Inscription : décembre 2004
Messages : 1 213
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 1 213
Points : 766
Points : 766
Par défaut boucle sur les répertoires

Bonjour, dans un dossier, j'ai plein de sous -dossiers et de fichiers. J'aimerais traiter tous les fichiers toto.txt qui se trouvent dans les sous-dossiers.

Si je fais

Code :
1
2
3
4
5
 
for i in $(ls)
do
blabla
done
alors je fais une boucle sur tout le contenu de mon dossier. J'aimerais faire qqch du genre

Code :
1
2
3
4
5
 
for i in $(ls et i est un répertoire)
do
blabla
done
Pouvez-vous m'aider s'il te plait ?
Merci
salseropom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 16h21   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 776
Points : 7 776
ta methode est tres lente et surtout échoue dans les répertoire où il y a trop de fichiers.


Code :
1
2
3
4
for i in $(ls -l | grep ^d | awk 'print $9')
do
....
done
le mieux et un traitement par recherche native bien plus performante

Code :
find . -type f -name "toto.txt" -exec .........{}............. \;
où {} represente le resultat de la recherche

par exemple pour vider les fichier toto.txt tu ferais :

Code :
find /chemin/ -type f -name "toto.txt" -exec cat /dev/null > {} \ ;
[fleme]en plus ça évites de faire un script pour rien [/fleme]
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 16h57   #3
Membre chevronné
 
Inscription : décembre 2004
Messages : 1 213
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 1 213
Points : 766
Points : 766
Citation:
Envoyé par frp31
ta methode est tres lente et surtout échoue dans les répertoire où il y a trop de fichiers.


Code :
1
2
3
4
for i in $(ls -l | grep ^d | awk 'print $9')
do
....
done
Salut, j'ai fait le code suivant

Code :
1
2
3
4
5
6
7
 
#!/bin/sh
 
for i in $(ls -l | grep ^d | awk '{print $9}')
do
echo "$i"
done
mais rien ne se passe. J'ai fait man grep mais je ne comprends pas pourquoi tu as mis l'accent circonflexe. Peux-tu être m'expliquer ton code s'il te plait ?

Sinon, je n'avais pas pensé à find. Je vais me pencher sur ta 2e version.

Merci encore.
salseropom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 17h08   #4
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 776
Points : 7 776
^d c'est commence par un d
donc est un repertoire.

tu dois bien sur faire ça dans un repertoire qui contient des sous répertoire sinon le tri remonte aucune information c qui est tout a fait logique puisque c'est ce qu'on veut....


fait les trois à la suite si tu veux comprendre les resultats intermédiaires :
sur /var ça devrait etre probant
Code :
1
2
3
4
 
ls -lart /var
ls -latr /var | grep ^d
ls -lart /var | grep ^d | awk '{print $9}'
mais evites les boulces chaque fois que c''est possible.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 17h13   #5
Membre chevronné
 
Inscription : décembre 2004
Messages : 1 213
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 1 213
Points : 766
Points : 766
Salut, d'accord, je vais faire ton code sur le /var

Autre chose : lorsque je fais

Code :
1
2
 
find . -name "Mean.txt"
j'obtiens la sortie suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
./N2/Mean.txt
./N10/Mean.txt
./N50/Mean.txt
./N100/Mean.txt
./N200/Mean.txt
./N300/Mean.txt
./N400/Mean.txt
./N500/Mean.txt
./N10000/Mean.txt
./N20000/Mean.txt
./N1000/Mean.txt
./N2000/Mean.txt
./N5000/Mean.txt
./N50000/Mean.txt
alors, j'ai fait le code suivant où j'ai couplé find et awk

Code :
1
2
 
 awk '{print $1,$3}' $(find . -name "Mean.txt") > T.txt
et là, tous mes fichiers Mean.txt se sont transformés en fichier T.txt (avec deux colonnes ce qui est normal). J'avoue que je n'ai pas compris pourquoi. Sais-tu ce que j'ai fait ?

Ce que je veux faire, est créer un fichier T.txt qui comprenne les colonnes 1 et 3 de tous mes fichiers Mean.txt. Je me dis que ce ne dois pas être trop compliqué...
salseropom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 17h18   #6
Membre chevronné
 
Inscription : décembre 2004
Messages : 1 213
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 1 213
Points : 766
Points : 766
Citation:
Envoyé par frp31
Code :
1
2
3
4
 
ls -lart /var
ls -latr /var | grep ^d
ls -lart /var | grep ^d | awk '{print $9}'
OK, j'ai compris ton code ! merci.

mais, sauf erreur de ma part, c'est

Code :
1
2
ls -lart /var | grep ^d | awk '{print $8}'
salseropom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2007, 01h59   #7
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 776
Points : 7 776
ca depand des systemes mais oui c'est possible

dans le doute tu peux utiliser $NF ou FN je sais plus pour prendre la derniere colone quelle qu'elle soit.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h55.


 
 
 
 
Partenaires

Hébergement Web