Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Mais non; ne dis pas qu'il a raison; il a tort.
Refabriquer une fonction de recherche n'est ni élégant, ni sensé. C'est du bricolage.
Il est bien plus "généraliste" de dire "Je recherche puis je filtre et re-filtre jusqu'à avoir mon résultat " que de faire sa tambouille perso à chaque dossier .
Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
Bon ok, ma contribution personnelle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 rechercheRecursiveDossier () { find "$1" -mindepth 1 -maxdepth 1 -path "$1/config" -printf "REP:%h\n" -quit -o -type d -exec echo {} \; | while read REP; do if [ "${REP/REP:/}" != "$REP" ]; then verifDossier "${REP/REP:/}" && echo "${REP/REP:/}"; else rechercheRecursiveDossier "$REP"; fi; done }
Cordialement.
Attend, mais t'es qui toi ?
Parce que tes deux find imbriqués c'est pas du bricolage peut-être ??? En tout cas mon script est quand-même plus élégant (et surtout plus évolutif) que ta ligne !!! Si tu crois que "programmer compact" est un gage de qualité...
Ouais ouais. Donc vaut mieux tout récupérer (quitte à avoir des milliers d'infos inutiles) puis éliminer ce qui ne va pas plutôt que ne récupérer que ce qui va...
Manque de bol pour toi, la "tambouille" (et surtout son évolutivité) fait partie du cahier des charges !!!
S'il avait juste voulu les fichiers config, à la rigueur ton truc peut passer, mais comme je te l'ai montré, le filtre du dossier aura besoin d'être complexifié. Comment tu feras s'il veut aussi que son dossier contienne un fichier "toto" fomaté comme /etc/passwd ??? Tu recodes tout ???
Excellent (surtout l'utilisation du printf pour formater la réponse afin de mieux la tester). Mais malheureusement ne fonctionne pas (selon le besoin exprimé) si le dossier racine (ici "$1) possède un fichier "config". Certes le dossier apparait dans la liste des résultats mais le script explore aussi les sous-dossiers. Dur hein ce "cas particulier" du premier dossier exploré...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Chez moi, cela fonctionne correctement, l'exploration des sous dossiers m'étonne puisqu'il il y a un maxdepth et mindepth, il est sure, au pire, on scan tout le dossier juste pour trouver le config mais pas plus (enfin selon moi).
Il y a le -quit qui force l'arret du find s'il le trouve...
Cordialement.
Peut-être que j'ai mal intégré ta fonction...
Voici mon arorescence test
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 moi@virtualux:~/aaa$ cat b.sh #!/bin/bash # Donc ici c'est ta fonction rechercheRecursiveDossier () { find "$1" -mindepth 1 -maxdepth 1 -path "$1/config" -printf "REP:%h\n" -quit -o -type d -exec echo {} \; | while read REP; do if [ "${REP/REP:/}" != "$REP" ]; then verifDossier "${REP/REP:/}" && echo "${REP/REP:/}"; else rechercheRecursiveDossier "$REP"; fi; done } # Elle fait appel à "verifDossier" donc j'ai remis le mien... verifDossier() { test -f "$1/config" } # Et il faut bien l'appeler... rechercheRecursiveDossier $1 | while read rep do echo "rep: $rep" done
Et son appel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 moi@virtualux:~/aaa$ tree -np a a |-- [drwxr-xr-x] a/a | `-- [-rw-r--r--] a/a/config |-- [-rw-r--r--] a/config |-- [drwxr-xr-x] a/x |-- [drwxr-xr-x] a/y | `-- [-rw-r--r--] a/y/config `-- [drwxr-xr-x] a/z `-- [drwxr-xr-x] a/z/a `-- [-rw-r--r--] a/z/a/config
...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 moi@virtualux:~/aaa$ ./b.sh a rep: a/a rep: a/y rep: a
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Bon, j'ai pas le même problème que toi, sur ton arborescence, j'ai le souci avec les répertoires qui ont un nom qui commence avec un caractère inférieur au caractère c (pour config), enfin dans mon cas, ici cela dépend de comment le find parcours le répertoire...
Le correctif serait celui-ci mais à part le fait que je n'utilise pas de boucle for pour le parcourt de fichier...:
J'aurai certainement pu faire un réarrangement pour utiliser directement la fonction verifDossier au lieu du test de présence de fichier...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #!/bin/bash # Donc ici c'est ta fonction rechercheRecursiveDossier () { ( [ -f "$1/config" ] && echo "REP:$1" || find "$1" -mindepth 1 -maxdepth 1 -type d -print ) | while read REP; do if [ "${REP/REP:/}" != "$REP" ]; then verifDossier "${REP/REP:/}" && echo "${REP/REP:/}"; else rechercheRecursiveDossier "$REP"; fi; done } # Elle fait appel à "verifDossier" donc j'ai remis le mien... verifDossier() { test -f "$1/config" } # Et il faut bien l'appeler... rechercheRecursiveDossier "$1" | while read rep do echo "rep: $rep" done
Sinon, un détail: ne pas oublier de protéger par des guillemets les variables pour ce protéger des nom de fichiers à la windows (avec des espaces).
Cordialement.
C'est vrai que find renvoie les fichiers dans un ordre un peu abscons (l'ordre du readdir() probablement). C'est aussi pour ça que je passais par un ls. Mais bon, au pire tu rajoutes un sort à ton find...
Pareil, tu fais un while read. La différence se verra si un des fichiers contient un espace dans son nom...
Moui. verifDossier à la place de ton test -f...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Ben Phoenix89 l'a bien dit (http://www.developpez.net/forums/d14...e/#post7781378). Pour l'instant il cherche juste config mais ensuite les tests peuvent s'étoffer
...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
L'idée du sort avait été ma première idée, ce qui donnait:
Tout ça m'a permit de voir la limite du find et peut-être le manque d'un commutateur de base sur celui-ci qui permettrait comme par exemple ici, de rechercher des repertoires si tel fichier n'existe pas (en tout cas, j'ai pas trouvé comment faire ).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 rechercheRecursiveDossier () { find "$1" -mindepth 1 -maxdepth 1 -path "$1/config" -printf "REP:%h\n" -quit -o -type d -printf "DEP:%p\n" | sort -r | while read REP; do if [ "${REP/REP:/}" != "$REP" ]; then verifDossier "${REP/REP:/}" && echo "${REP/REP:/}"; break; else rechercheRecursiveDossier "${REP/DEP:/}"; fi; done }
Cordialement.
Comme j'avais 5 minutes, voici la dernière version "simplifiée" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 rechercheRecursiveDossier () { find "$1" -mindepth 1 -maxdepth 1 $(verifDossier "$1" && echo -n "-printf REP:%h\\n -quit") -type d -print | while read REP; do [ "${REP/REP:/}" != "$REP" ] && echo "${REP/REP:/}" || rechercheRecursiveDossier "${REP}"; done }
Cordialement.
Vous m'avez été d'une grande aide. Encore une fois merci à tous
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager