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 03/12/2010, 16h03   #1
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
Par défaut Réaliser Find manuellement

Bonjour,

Je suis débutant dans l'art d'écrire en shell ^^ et j'aimerais réaliser un find mais manuellement. En fait, ce serait un find bien limité, pusique je n'aurais qu'un étage de sous-répertoires :

répertoirePrincipal : sousRep_1 sousRep_2 ... sousRep_n (chaqu'un ayant un certain nombre de fichiers)

Ce serait à priori une boucle parcourant récursivement les sous-répertoires et une parcourant ensuite tous les fichiers de ces répertoires.

Seulement, je ne sais pas trop quelles conditions d'arrêt mettre dans ces boucles, comment dire "quand tu auras parcouru tous les sousRépertoires" ou de façon similaire pour la deuxième boucle "quand tu auras parcouru tous les fichiers". C'est peut-être simple, mais je ne vois vraiment pas.
Aussi, j'aimerais savoir, et c'est peut-être lié, comment entrer dans le premier répertoire, puis le deuxième, etc sans connaître leurs noms.

D'avance, prière de m'excuser si mes questions sont absurdes
Et merci à l'âme charitable qui me mettra sur la voie
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 16h39   #2
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 940
Points : 5 940
Salut.

Ce bout de code pourra peut être te servir :

Code :
1
2
3
4
5
6
7
8
9
#!/bin/bash
 
for i in * # on parcourt le répertoire courrant élément par élément
do
    if [ -d $i ] # si $i (position du curseur lors du parcours) est un répertoire
    then
        # traitements ...
    fi
done
Bonne chance

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 17h11   #3
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
Je vais regarder ça de plus près .

Merci.
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 18h16   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 059
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 059
Points : 4 115
Points : 4 115
GRRR...
il faut juste définitivement oublier d'utiliser ls dans un script, parce que sinon :
Code :
1
2
3
4
touch mon\ fichier
<s>for i in $(ls ./); do echo "$i"; done</s>
mon
fichier
et préférer :
Code :
1
2
for i in *; do echo "$i"; done
mon fichier
!!!
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/12/2010, 18h21   #5
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 940
Points : 5 940
Effectivement (merci).
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 18h23   #6
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
Idriss :

Le code est très bien, encore merci !

En fait j'ai plus qu'une question au final, de la même façon qu'on parcourt tous les éléments du répertoire REP, on va parcourir les éléments du sous-répertoire courant. La condition sera if [ -f $k ] pour dire que si on est sur un FICHIER cette fois on fait "blablabla", bref ça nickel.
Par contre, ma seule question est alors, comment entrer dans ce sous-répertoire lorsque le curseur est sur ce dernier, donc avant de rentrer dans ma deuxième boucle. Il faudrait que je fasse une sorte de SOUSREP = "sous-répertoire courant" mais je ne sais justement pas comment. Je suppose que c'est grâce à mon $i ?

N_BaH :


Ton code passe en revue tous les éléments du répertoire ?
Et pourquoi éviter ls en fait ("je vais encore passer pour un noob") :p ?
J'ai toujours du mal à comprendre tes codes lol, désolé.
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 18h27   #7
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 940
Points : 5 940
Citation:
Envoyé par slig_80 Voir le message
Et pourquoi éviter ls en fait ("je vais encore passer pour un noob") :p ?
Parce que si tu as un fichier un nom composé d'espace, il sera perçu comme plusieurs occurrences dans la boucle (comme le montre l'exemple de N_Bah). Ce qui n'est pas le cas en parcourant le répertoire courant à l'aide du symbole *

Après si tu veux parcourir un répertoire autre que le répertoire courant dans lequel tu exécutes le script, tu peux t'arranger avec un cd avant la boucle.

J'ai adapté mon code en fonction de la remarque pertinente de N_Bah. Après on peut parfois être amené à utiliser ls pour récupérer plus d'informations (les droits des fichiers, l'utilisateur propriétaire, etc).
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 18h31   #8
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
ha ok effectivement, très bonne remarque de N_BaH qui m'aura empêcher de me prendre la tête à savoir pourquoi ça foirait

Bon je vais changer ça tout de suite.

Merci à vous deux
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 18h49   #9
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
Tiens au point ou j'en suis, comment peut-on obtenir le nom du répertoire courant ?

pwd donne le chemin et pas que le nom...
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 18h51   #10
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 940
Points : 5 940
Citation:
Envoyé par slig_80 Voir le message
Par contre, ma seule question est alors, comment entrer dans ce sous-répertoire lorsque le curseur est sur ce dernier, donc avant de rentrer dans ma deuxième boucle. Il faudrait que je fasse une sorte de SOUSREP = "sous-répertoire courant" mais je ne sais justement pas comment. Je suppose que c'est grâce à mon $i ?
Sans utiliser ls :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
if [ $# -ge 1 ] && [ -d $1 ] # Si on as au moins un paramètre et que le premier paramètre est un répertoire
then
    cd $1 # on va dans ce répertoire
fi
 
for i in *
do
    if [ -d $i ]
    then
        for j in $i/*
        do
            # ... traitements
        done
    else
        # ... traitements
    fi
done
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 18h55   #11
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
lol oui ,j'avais oublié ma question en cours de route ^^

Merci
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 19h08   #12
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
euh, quand je fais un pwd dans ma deuxième boucle il n'a pas l'air d'être entré dans le sous-répertoire...
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 19h12   #13
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Citation:
Envoyé par ok.Idriss Voir le message
for j in $i/*
Attention que si $i/* est un répertoire vide, tu va obtenir une variable j qui va valoir 'repertoirevide/*'
becket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/12/2010, 19h20   #14
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
Citation:
Attention que si $i/* est un répertoire vide, tu va obtenir une variable j qui va valoir 'repertoirevide/*'
Oui, j'ai fait attention à ce qu'il y ait des fichiers dans mes sous-dossiers
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 19h41   #15
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 059
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 059
Points : 4 115
Points : 4 115
Citation:
Envoyé par ok.idriss
Après on peut parfois être amené à utiliser ls pour récupérer plus d'informations (les droits des fichiers, l'utilisateur propriétaire, etc).
pourquoi ? pour utiliser cut ou sed ou awk derrière ? stat donne des résultats précis et concis.

Citation:
Envoyé par becket
Attention que si $i/* est un répertoire vide, tu va obtenir une variable j qui va valoir 'repertoirevide/*'
oui, il faut utiliser shopt -s nullglob avant de démarrer la boucle.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/12/2010, 19h43   #16
Invité régulier
 
Inscription : décembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 31
Points : 5
Points : 5
En fait, faire pwd ést débile, car c'est comme quand on fait un find, le dossier courant reste celui du début donc faire un pwd m'induisait en erreur.

Et là apparemment tout fonctionne. Donc un grand merci à vous tous et un merci particulier à Idriss
slig_80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 10h19   #17
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 940
Points : 5 940
Bonjour.

Citation:
Envoyé par N_BaH Voir le message
pourquoi ? pour utiliser cut ou sed ou awk derrière ? stat donne des résultats précis et concis.
C'est vrai, je n'aurais pas du dire "on peut être amené à utiliser ls" mais tout simplement "on pourrait utiliser ls". Mais la sortie de ls -l étant structurée (en colonnes), on a pas besoin de la parser à l'aide de sed ou awk (ou même cut), non ?

Exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
ls -l | while true
do
    read ligne # on récupère la ligne (ou est positionné le curseur)
 
    if [ "$ligne" = "" ] # si la ligne est vide (dernière ligne)
    then
        exit # on stop la boucle
    else
        set -- $ligne # on éclate la ligne
        echo $1 # les droits (premier mot de la ligne)
        echo $3 # utilisateur propriétaire
        # ...
    fi
done
Cependant comme tu le dis, il semble bien mieux d'utiliser stat (dont je n'avais pas trop l'habitude d'utiliser jusqu'ici mais dont je viens de voir les différentes options via la man page) afin d'éviter les boucles un peu tordues comme celle que je viens de faire .

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 10h24   #18
Membre Expert
 
Avatar de jabbounet
 
frederic frances
Inscription : juin 2009
Messages : 1 703
Détails du profil
Informations personnelles :
Nom : frederic frances
Âge : 36

Informations forums :
Inscription : juin 2009
Messages : 1 703
Points : 2 115
Points : 2 115
Au lieu de

Code :
1
2
3
ls -l | while true
do
    read ligne
pourquoi ne pas faire?

Code :
1
2
ls -l | while read ligne
do
__________________
BAZAR est un joyeux bordel improvisé ! Tous les mardis.
http://www.improetcompagnie.com/publ...ctacles-6.html

Citation:
Envoyé par Isaac Asimov
Pour réussir, il ne suffit pas de prévoir. Il faut aussi savoir improviser
Pour les utilisateurs d'emacs:
http://www.emacswiki.org/

Attends de voir ce qui vas sortir de:
http://www.pushmid.com
jabbounet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/12/2010, 10h29   #19
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 940
Points : 5 940
Citation:
Envoyé par jabbounet Voir le message
Au lieu de

Code :
1
2
3
ls -l | while true
do
    read ligne
pourquoi ne pas faire?

Code :
1
2
ls -l | while read ligne
do
Effectivement, c'est une simple (mauvaise) habitude héritée des cours que j'ai reçus auparavant ...
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 12h40   #20
Membre Expert
 
Avatar de jabbounet
 
frederic frances
Inscription : juin 2009
Messages : 1 703
Détails du profil
Informations personnelles :
Nom : frederic frances
Âge : 36

Informations forums :
Inscription : juin 2009
Messages : 1 703
Points : 2 115
Points : 2 115
Citation:
Envoyé par ok.Idriss Voir le message
Effectivement, c'est une simple (mauvaise) habitude héritée des cours que j'ai reçus auparavant ...
cette forme n'est pas mauvaise en soi, c'est une écriture différente.
je m'interrogeais sur la raison c'est tout.
__________________
BAZAR est un joyeux bordel improvisé ! Tous les mardis.
http://www.improetcompagnie.com/publ...ctacles-6.html

Citation:
Envoyé par Isaac Asimov
Pour réussir, il ne suffit pas de prévoir. Il faut aussi savoir improviser
Pour les utilisateurs d'emacs:
http://www.emacswiki.org/

Attends de voir ce qui vas sortir de:
http://www.pushmid.com
jabbounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h46.


 
 
 
 
Partenaires

Hébergement Web