Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3046 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [KSH] Find : iname + expression régulière ? - RESOLU -

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[KSH] Find : iname + expression régulière ? - RESOLU -

n°1978793
Kerrozen
To be or not to be ... cool ..
Posté le 30-03-2010 à 11:04:15  profilanswer
 

Bonjour à tous,  
 
Dans la série des quesitons à la c**, je voudrais le FIND....
 
Piont de départ : un petit script qui permet de faire une recherche sur plusieurs comptes USER. Je passe une variable correspondant à la saisie utilisateur au find qui va me chercher ça.
La commande find en détail :  
 

Code :
  1. find /tst${i}/K2 -type f -name "${fic}" 2>&- >> ./found_files.txt


 
note : On se moque du ${i} qui ne sert qu'à balayer tous les comptes USERS de cette forme.
 
Mon souci : quand l'utilisateur saisie un truc du genre *fichier*txt qui va dans la variable ${fic}, ça me renvoit bien tout les ficheirs correspondant au filtre, mais biensûr en tenant compte de la casse ! donc aucun fichier du style "*fichier*TXT". Or je ne veux pas demander à l'utilisateur de bricoler son paramètre. Lui il tape *fichier*txt et je veux tout récupérer.
 
J'ai donc pensé à l'option 'iname' au lieu de 'name' mais là, surprise, les expressions régulières ne passent plus : je n'ai plus aucun résultat, simplement en remplaçant name par iname ...  :ouch:  :ouch:  :ouch:  
 
Quelqu'un saurait-il m'expliquer le souci ?
 
Merci d'avance pour vos lumières.


Message édité par Kerrozen le 13-04-2010 à 13:11:59

---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
mood
Publicité
Posté le 30-03-2010 à 11:04:15  profilanswer
 

n°1978812
art_dupond
je suis neuneu... oui oui !!
Posté le 30-03-2010 à 11:38:41  profilanswer
 

enlève pit-être le

 

2>

 

pour voir s'il te dit quelque chose (pit-être qu'il ne connait pas iname) ?


Message édité par art_dupond le 30-03-2010 à 11:39:37

---------------
oui oui
n°1978866
Kerrozen
To be or not to be ... cool ..
Posté le 30-03-2010 à 13:38:56  profilanswer
 

... ben .... ben mince....
 
V'là t'y pas que le find diffère selon les distributions de Ninix ... ( payantes en plus !)  C'est ....
 
C'est moche en fait ....
 
Bon ben, tant pis pour moi alors :-(
 
Merci quand même art_dupond


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
n°1978871
Elmoricq
Modérateur
Posté le 30-03-2010 à 13:46:24  profilanswer
 

Kerrozen a écrit :

V'là t'y pas que le find diffère selon les distributions de Ninix ... ( payantes en plus !)


POSIX ne définit que l'existence obligatoire de certains outils, et la standardisation de certaines options. Tous les "bonus" propres à certaines distributions ne sont pas forcément disponibles sur d'autres.


Message édité par Elmoricq le 30-03-2010 à 13:46:53
n°1978876
Kerrozen
To be or not to be ... cool ..
Posté le 30-03-2010 à 13:51:40  profilanswer
 

Ben à ce moment là je trouve très regrettable qu'un utilitaire reconnu super puissant pour les recherches sous Unix n'ait pas comme option standard de switcher en mode case senstive ou non... Encore une logique logique !
 
Mais bon, j'imagine que mon mode de pensée n'est rien vis à vis des grands pontes POSIXiens ^^ (ou qu'il est trop tard pour ces détails ?)
 
Bref ! on s'égare, merci quand même pour la précision.


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
n°1978880
pataluc
Posté le 30-03-2010 à 13:53:32  profilanswer
 

tu peux sans doute contourner le problème (de manière un peu crade), en filtrant grace à un grep plutot que grace au "-name" de find...


Message édité par pataluc le 30-03-2010 à 13:53:42
n°1978885
Kerrozen
To be or not to be ... cool ..
Posté le 30-03-2010 à 13:59:06  profilanswer
 

Ben justement, de manière un peu crade. J'ai peur que ce soit trop gourmand:  bricoler un truc avec find . -print | grep -i .... va dans un premier temps me lister tous les fichiers de la machine avant d'appliquer le grep et ça, c'est pas bon ça ! ça va pas plaire à la machine de test qui est déjà raz la tronche, alors ne parlons pas des machines de production.
 
Pas grave pas grave, l'utilisateur n'aura qu'à savoir ce qu'il veut et puis c'est tout ^^


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
n°1978919
art_dupond
je suis neuneu... oui oui !!
Posté le 30-03-2010 à 14:34:21  profilanswer
 

c'est quelle distribution ? tu peux pas installer un autre find ?


---------------
oui oui
n°1978955
Kerrozen
To be or not to be ... cool ..
Posté le 30-03-2010 à 15:14:36  profilanswer
 

euh... 'machines tests' 'machine de production' 'client' ....
 
disons que je ne fais pas ce que je veux mais plutôt ce que je peux ^^


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
n°1981539
Leif Eriks​on
Guess I'm doing fine...
Posté le 07-04-2010 à 11:50:20  profilanswer
 

Kerrozen a écrit :

Ben justement, de manière un peu crade. J'ai peur que ce soit trop gourmand:  bricoler un truc avec find . -print | grep -i .... va dans un premier temps me lister tous les fichiers de la machine avant d'appliquer le grep et ça, c'est pas bon ça ! ça va pas plaire à la machine de test qui est déjà raz la tronche, alors ne parlons pas des machines de production.
 
Pas grave pas grave, l'utilisateur n'aura qu'à savoir ce qu'il veut et puis c'est tout ^^


 
J'avais le même soucis sur AIX 5.3, avec le case sensitive pour l'option -name du find.
 
Pas besoin de bricoler avec un pipe, tu peux appliquer des fonctions directement dans l'exécution du find, c'est bcp plus rapide que de traiter tout le résultat via un pipe
 
Par exemple :
find /tst${i}/K2 -type f | grep -i "${fic}"
 
devient
 
find /tst${i}/K2 -type f -exec grep -i "${fic}" {} \;


Message édité par Leif Erikson le 07-04-2010 à 11:55:07
mood
Publicité
Posté le 07-04-2010 à 11:50:20  profilanswer
 

n°1981605
Kerrozen
To be or not to be ... cool ..
Posté le 07-04-2010 à 15:06:17  profilanswer
 

Oui, mais tu le dis : c'est équivalent, dans les deux cas tu perds l'intérêt du find, puisqu'il va de toute façon appliquer un traitement en second temps sur tous les fichiers qu'il a récupéré dans un premier temps. Il doit effectivement y avoir un petit gain en utilisant -exec mais bon, j'en suis pas sûr ?
 
Je pense que justement, l'intérêt serait bien de filtrer dès la première opération de recherche ? Surtout pour des trucs aussi triviaux que la casse des lettres. Si encore t'avais un truc tordu je dis pas qu'il faille utiliser un traitement supplémentaire ! Mais là bon.....


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
n°1981668
pataluc
Posté le 07-04-2010 à 16:10:40  profilanswer
 

je suis pas sur gain de passer le grep en -exec, il va lancer la commande autant de fois qu'il y a de fichiers, non?

n°1981678
Leif Eriks​on
Guess I'm doing fine...
Posté le 07-04-2010 à 16:34:55  profilanswer
 

pataluc a écrit :

je suis pas sur gain de passer le grep en -exec, il va lancer la commande autant de fois qu'il y a de fichiers, non?


 
Oui, mais pour l'avoir mis en place sur un système de Production avec des dizaines de milliers de fichiers, le -exec a tjs été plus rapide qu'un pipe suivi d'un grep.
 
Après, l'implémentation du -iname en case non sensitive est bien plus performante, mais je suis en souche AIX spécifique chez mon client (niveau 3 de sécurité) qui interdit l'utilisation d'un autre find (ou tout autre binaire système sorti de la souche), donc on fait avec les moyens du bord [:spamafote]:D

n°1981711
Kerrozen
To be or not to be ... cool ..
Posté le 07-04-2010 à 19:12:50  profilanswer
 

Ok ok, Leif me confirme donc ce que je pensais.
 
Bon ben ça fera une très bonne rustine vu les contraintes client derrière ^^
 
Merci à tous pour vos conseils et retours d'expérience !


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
n°1981740
pataluc
Posté le 07-04-2010 à 21:39:07  profilanswer
 

Leif Erikson a écrit :

Oui, mais pour l'avoir mis en place sur un système de Production avec des dizaines de milliers de fichiers, le -exec a tjs été plus rapide qu'un pipe suivi d'un grep.


 
j'aurais pensé l'inverse, mais plus par impression que par expérience. Je le note donc.  :jap:

n°1981766
Leif Eriks​on
Guess I'm doing fine...
Posté le 07-04-2010 à 23:06:15  profilanswer
 

Pas de soucis, le forum sert à partager ses expériences :)
 
J'essayerais demain de faire une petite comparaison chiffrée avec une recherche massive, je vous en ferais part :jap:

n°1981950
Leif Eriks​on
Guess I'm doing fine...
Posté le 08-04-2010 à 13:25:47  profilanswer
 

Ouhlala, grosse grosse erreur, mea culpa, je me suis mélangé les pinceaux. [:kzimir]  
 
Le grep dans le -exec va lire le contenu des fichiers au fûr et à mesure, bonjour les perfs [:ddr555]
 
Si on ne dispose pas de l'option -iname, il y a plusieurs solutions, je ne vais citer que les deux qui me semblent les plus performantes :
Exemple : on recherche tous les fichiers suffixés par .gz ou .GZ
 
1) on connait à l'avance toutes les occurences de la casse, dans ce cas il faut utiliser l'opérateur "OR"(-o) du find :

Code :
  1. find . -type f -follow -name "*.gz" -o -name "*.GZ"


 
2) on ne connait pas toutes les occurences de la recherche, et au lieu de faire une boucle après le find, on peut utiliser la fonction xargs en traitant le résultat sous forme de liste, puis on pipe avec le grep sans la casse :
find . -type f -follow | xargs -I file echo file | grep -i ".gz$"

 
EDIT suite à l'intervention parfaitement recevable de pataluc  :o  :D  
2) on ne connait pas toutes les occurences de la recherche, on grep après le find

Code :
  1. find . -type f -follow | grep -i ".gz$"


 
 
Voilà, désolé pour la confuse d'hier [:leif erikson]


Message édité par Leif Erikson le 08-04-2010 à 16:45:24
n°1982000
Leif Eriks​on
Guess I'm doing fine...
Posté le 08-04-2010 à 14:31:16  profilanswer
 

Hop, une petite mesure effectuée sur une baie de 40To pour la recherche de tous les fichiers avec le suffixe .gz ou .GZ :
 

Code :
  1. time find / -type f -follow -name "*.gz" -o -name "*.GZ" 2>/dev/null | wc -l
  2. 79298
  3. real    1m42.51s
  4. user    0m0.21s
  5. sys     0m0.42s
  6. time find / -type f -follow -print 2>/dev/null | grep -i ".gz$" | wc -l
  7. 79298
  8. real    19m13.74s
  9. user    3m46.13s
  10. sys     14m54.04s


 
On peut remarquer que l'utilisation du find avec l'opérateur OR est évidemment bien plus rapide si on connait à l'avance toutes les occurrences de la casse.
 
 
Note pour ceux que çà intéressent :
Les options du find supportent les opérateurs logiques -o = OR , -a = AND, ! = NOT
Par exemple :
si on souhaite récupérer les fichiers plus vieux que 3 jours dont :
- le suffixe est ".gz" mais que le nom ne commence pas par "test_"
- ou tous les fichiers suffixés par ".out"
voici la commande :
 

Code :
  1. find . -type f -mtime +3 -a \( \( -name "*.gz" -a ! -name "test_*" \) -o \( -name "*.out" \) \)


Message édité par Leif Erikson le 08-04-2010 à 16:43:14
n°1982085
pataluc
Posté le 08-04-2010 à 16:30:30  profilanswer
 

je vois pas pourquoi tu mets un xargs par contre??
 

Code :
  1. find / -type f -follow -print 2>/dev/null | grep -i ".gz$" | wc -l

ca marcherait pareil...

n°1982086
Leif Eriks​on
Guess I'm doing fine...
Posté le 08-04-2010 à 16:36:50  profilanswer
 

pataluc a écrit :

je vois pas pourquoi tu mets un xargs par contre??
 

Code :
  1. find / -type f -follow -print 2>/dev/null | grep -i ".gz$" | wc -l

ca marcherait pareil...


 
Pas faux [:klemton]
 
La fatigue surement [:theorie des lavabos]
 
EDIT : j'édite mes posts pour éviter les commandes inutiles :o
EDIT² : les durées d'exécution ne changent pas par contre (ce qui est logique)


Message édité par Leif Erikson le 08-04-2010 à 16:53:42
n°1983555
Kerrozen
To be or not to be ... cool ..
Posté le 13-04-2010 à 12:44:48  profilanswer
 

Donc  en fait, si je suis bien toutes vos analyses, on reste sur la même conclusion :
 
find + grep si j'ai pas d'option iname ^^
 
Nan parce que je me disais qu'il fallait recentrer le débat là, sinon Leif va nous faire une rupture de durite cérébrale  :lol:  :D  :sol:  
 
En tout cas merci pour vos interventions, on en apprend tous les jours (surtout avec des preuves chiffrées : merci à Leif pour s'être pris le choux et nous donner des preuves aussi précises  :jap:  :jap:  :jap: !)


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
n°1983558
Leif Eriks​on
Guess I'm doing fine...
Posté le 13-04-2010 à 12:51:59  profilanswer
 

Kerrozen a écrit :

Donc  en fait, si je suis bien toutes vos analyses, on reste sur la même conclusion :
 
find + grep si j'ai pas d'option iname ^^
 
Nan parce que je me disais qu'il fallait recentrer le débat là, sinon Leif va nous faire une rupture de durite cérébrale  :lol:  :D  :sol:  
 
En tout cas merci pour vos interventions, on en apprend tous les jours (surtout avec des preuves chiffrées : merci à Leif pour s'être pris le choux et nous donner des preuves aussi précises  :jap:  :jap:  :jap: !)


 
Non, non, mais tout va bien  [:kzimir]  [:k@nt]  
 
Si tu as peu de valeurs de casse différentes (genre : gz, GZ, Gz et gZ), utilise le séparateur "OU" du find, qui est bien plus performant.
 
Bon, si t'as ointes mille valeurs de casse différentes, le "|grep -i" résoudra ton problème en te faisant perdre ton temps efficacement [:leif erikson]

n°1983561
Kerrozen
To be or not to be ... cool ..
Posté le 13-04-2010 à 12:57:58  profilanswer
 

mwé, donc solution du grep.
 
après, de toi à moi, le client il a rien précisé sur le temps que ça devait ou non prendre ^^
 
C'est pour un truc en One shot donc ça prendra le temps qu'il faut : on n'est pas à 30 min près !
 
See you soon !


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [KSH] Find : iname + expression régulière ? - RESOLU -

 

Sujets relatifs
[Résolu] jquery , 2 div draggable l'un dans l'autreinclude ajax php [Résolu]
[resolu]lire un attribut prive (poo)[Résolu] Perte de feuille de style sur changement de page
(Résolu) Elements invisibles dans le html suite à un include[resolu] Problème API Google maps / file_get_contents disabled
Gestion de la mémoire (résolu, merci !)[RESOLU] Erreur à la compilation :(
[pascal] programme pascal qui transforme "123" en "102030" résolu[Résolu] Bloquer l'envoi d'un formulaire
Plus de sujets relatifs à : [KSH] Find : iname + expression régulière ? - RESOLU -


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR