OVH Cloud OVH Cloud

find : recherche sur le nom du chemin d'accès

7 réponses
Avatar
deub
Bonjour,

J'ai un grand nombre de répertoire (mettons de 1 à 999) qui contient
différents répertoires dont un répertoire src.
Je veux rechercher tous les fichiers .c contenus dans ces répertoires src
(mais ceux des répertoires src_old par ex).

Je peux écrire :

find */src/ -name "*.c"

et ça fonctionne mais si le nombre de répertoire est trop important, je
finis par obtenir le message
"ksh: /usr/bin/find: 0403-027 The parameter list is too long."

D'après man find, on peut filtrer avec la commande find sur le nom du chemin
d'accès :
"To find all accessible files whose path name contains find, type: find
. -name '*find*' -print"

J'ai donc essayé

find . -name "*/src/*.c"

mais ça ne donne rien ...

Quelqu'un a une solution ?

(j'ai cru comprendre qu'un option -path existait mais elle n'existe pas chez
moi (AIX 4.3.3))

7 réponses

Avatar
Fred
Bonjour,

J'ai un grand nombre de répertoire (mettons de 1 à 999) qui contient
différents répertoires dont un répertoire src.
Je veux rechercher tous les fichiers .c contenus dans ces répertoires src
(mais ceux des répertoires src_old par ex).

Je peux écrire :

find */src/ -name "*.c"

et ça fonctionne mais si le nombre de répertoire est trop important, je
finis par obtenir le message
"ksh: /usr/bin/find: 0403-027 The parameter list is too long."

D'après man find, on peut filtrer avec la commande find sur le nom du chemin
d'accès :
"To find all accessible files whose path name contains find, type: find
. -name '*find*' -print"

J'ai donc essayé

find . -name "*/src/*.c"

mais ça ne donne rien ...

Quelqu'un a une solution ?

(j'ai cru comprendre qu'un option -path existait mais elle n'existe pas chez
moi (AIX 4.3.3))




Bonjour,

Il faut mettre des simples quote sinon c'est le shell qui interprète les *

find . -name '*/src/*.c'


A+

Fred

Avatar
Stephane Chazelas
On Wed, 14 Dec 2005 12:35:03 +0100, deub wrote:
[...]
Je peux écrire :

find */src/ -name "*.c"

et ça fonctionne mais si le nombre de répertoire est trop important, je
finis par obtenir le message
"ksh: /usr/bin/find: 0403-027 The parameter list is too long."
[...]

find . -name "*/src/*.c"

mais ça ne donne rien ...

Quelqu'un a une solution ?
[...]


find . ( -name . -o -prune ) -name src -type d -exec
find {} -name '*.c' -print ;


--
Stephane

Avatar
Stephane Chazelas
On 14 Dec 2005 14:50:12 GMT, Stephane Chazelas wrote:
On Wed, 14 Dec 2005 12:35:03 +0100, deub wrote:
[...]
Je peux écrire :

find */src/ -name "*.c"

et ça fonctionne mais si le nombre de répertoire est trop important, je
finis par obtenir le message
"ksh: /usr/bin/find: 0403-027 The parameter list is too long."
[...]

find . -name "*/src/*.c"

mais ça ne donne rien ...

Quelqu'un a une solution ?
[...]


find . ( -name . -o -prune ) -name src -type d -exec
find {} -name '*.c' -print ;
[...]


Oops, non, c'est plutot:

find . ( -name . -o -prune ) -type d -exec sh -c '
[ -d "$1/src" ] && exec find "$1/src" -name "*.c" -print' {} {} ;

Avec zsh:

print -rl -- */src/**/*.c


--
Stephane


Avatar
deub
Merci pour les réponses.

find . ( -name . -o -prune ) -name src -type d -exec
find {} -name '*.c' -print ;



Ca me semble bien ...
Le "( -name . -o -prune )", c'est pour se limiter au répertoire courant ,
c'est ça ?
J'ai un peu de mal avec le prune, et pourtant, j'ai fait un man !


Oops, non, c'est plutot:

find . ( -name . -o -prune ) -type d -exec sh -c '
[ -d "$1/src" ] && exec find "$1/src" -name "*.c" -print' {} {} ;


Alors là ... pourquoi faut il relancer un shell ??

Avec zsh:

print -rl -- */src/**/*.c


C'est quand même plus simple. Dommage que je n'ai pas accès à zsh !


Avatar
deub
Il faut mettre des simples quote sinon c'est le shell qui interprète les *

find . -name '*/src/*.c'


Les guillmets doubles protègent aussi les * non ?

Avatar
Fred
Il faut mettre des simples quote sinon c'est le shell qui interprète les *

find . -name '*/src/*.c'



Les guillmets doubles protègent aussi les * non ?




oui, tu as raison.


Avatar
Stephane Chazelas
On Thu, 15 Dec 2005 15:36:48 +0100, deub wrote:
[...]
Le "( -name . -o -prune )", c'est pour se limiter au répertoire courant ,
c'est ça ?


C'est ca.

Oops, non, c'est plutot:

find . ( -name . -o -prune ) -type d -exec sh -c '
[ -d "$1/src" ] && exec find "$1/src" -name "*.c" -print' {} {} ;


Alors là ... pourquoi faut il relancer un shell ??
[...]


Parce que {}/src ne marche pas. {} n'est remplacé par le chemin
du fichier que s'il est tout seul dans son argument (quoique
certains find le font aussi dans foo{}bar mais c'est pas
standard).

--
Stephane