#1 Le 10/09/2010, à 10:28
- wolf85kunst
La commande "Find" couplé avec une expression régulière [RESOLU]
Bonjour à tous,
Je souhaite effectuer une recherche depuis la racine, renseignée par une expression régulière.
Par exemple, je souhaite effectuer une recherche de ce type :
find / -type f -name ^go{1,}gl[aeiouy]+
Cette recherche pourrait me trouver :
google.txt
goooogle.txt
googla
gogliii
...
Bien entendu, cette commande ne marche pas;
Comment faire ? La coupler avec un | egrep ou un truc du genre ?
Je vous remercie.
Dernière modification par wolf85kunst (Le 10/09/2010, à 15:51)
Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --
Hors ligne
#2 Le 10/09/2010, à 10:31
- yannzbig
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Bonjour,
Tu peux utiliser -exec. Exemple avec un find qui recherche toutes les occurrences de "phrase a chercher" dans tous les fichiers depuis l'emplacement courant:
find . -type f -exec grep -i "phrase a chercher" {} \; -print
#3 Le 10/09/2010, à 10:59
- Totor
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Pour utiliser les expressions rationnelles (et non expressions régulières qui est un abus de langage) avec find, il faut utiliser -regex (ou -iregex) et non -name (ou -iname).
Il est possible aussi de préciser le type d'ER(E) via l'option -regextype
--> man find !
Dernière modification par Totor (Le 10/09/2010, à 11:06)
-- Lucid Lynx --
Hors ligne
#4 Le 10/09/2010, à 11:04
- miniSeb
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Euuuh Ça n'est pas expression rationnelle ?
Hors ligne
#5 Le 10/09/2010, à 11:06
- Totor
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Euuuh Ça n'est pas expression rationnelle ?
arg oui, c'est ce à quoi je pensais ...
les relations relationnelles, c'est encore autre chose !
(je corrige)
-- Lucid Lynx --
Hors ligne
#6 Le 10/09/2010, à 11:21
- wolf85kunst
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Merci beaucoup.
Concrètement que donnerait cette commande :
find / -type f -exec grep -i ^g{1,}gl[aeiouy]+ {} \; -print
(selon yannzbig)
find / -type f -regex ^g{1,}gl[aeiouy]+
(Totor)
Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --
Hors ligne
#7 Le 10/09/2010, à 11:29
- Totor
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
le meilleurs moyen de savoir est de tester !
mais encore une fois man find
-- Lucid Lynx --
Hors ligne
#8 Le 10/09/2010, à 14:00
- wolf85kunst
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
find / -iregex "expression"
Ca marche plutot pas mal.
Cependant :
- J'ai remarqué que la recherche s'effectue sur la totalité du chemin : "/home/user/google.txt" (pour reprendre l'exemple du fichier google).
Remarque :
find / -iregex "google.txt"
find / -iregex "^google.txt"
ne marche pas
Par contre :
find / -iregex ".*google.txt"
Ceci marche.
Aussi :
find / -iregex ".*go{1,}gle.txt"
Pour trouver gogle.txt; google.txt, goooooogle.txt, etc.
Find de trouve pas le fichier google.txt avec les accolades.
Avez-vous des compléments d'informations, solutions, sur ces trois cas de figures ?
Comment spécifier une répétition de caractères : x{1,4} -> x répété entre 1 et 4 fois. ?
Merci à tous.
Dernière modification par wolf85kunst (Le 10/09/2010, à 14:21)
Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --
Hors ligne
#9 Le 10/09/2010, à 14:18
- credenhill
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
puisque l'expression concerne le chemin complet et pas seulement le nom, pour trouver un fichier qui commence par g utiliser .*/g à la place de ^g
Hors ligne
#10 Le 10/09/2010, à 15:02
- ehmicky
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Tout ce que tu dis dans ton dernier message est juste (ne pas oublier de mettre des double guillemets autour de l'argument de -regex, -iregex, mais aussi -name, -iname, etc.)
Pour la question des {1,4} qui ne marche pas, c'est parce qu'il faut changer le type de regexps. Par défaut, c'est sur "emacs", tu peux changer par exemple :
find -regextype "posix-extended" -iregex ".*/go+gl[aeiouy]{1,4}"
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#11 Le 10/09/2010, à 15:07
- Totor
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Pour la question des {1,4} qui ne marche pas, c'est parce qu'il faut changer le type de regexps. Par défaut, c'est sur "emacs", tu peux changer par exemple :
find -regextype "posix-extended" -iregex ".*/go+gl[aeiouy]{1,4}"
d'où mon :
[..]Il est possible aussi de préciser le type d'ER(E) via l'option -regextype[..]
-- Lucid Lynx --
Hors ligne
#12 Le 10/09/2010, à 15:16
- credenhill
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
@ehmicky : j'ajouterais un .* final
find -regextype "posix-extended" -iregex ".*/go+gl[aeiouy]{1,4}.*"
Hors ligne
#13 Le 10/09/2010, à 15:26
- ehmicky
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Je l'avais retiré parce que ça rendait inutile le {1,4}, puisque de toute manière tout caractère peut suivre une occurence de [aeiouy], c'était juste pour montrer l'usage de {1,4}
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#14 Le 10/09/2010, à 15:29
- wolf85kunst
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Merci à tous, merci ehmicky. Je vais pouvoir m'amuser à faire des jolis Regex.
Une dernière question cependant, sur les expressions régulière (ou rationnelles) :
Comment indiquer que l'on souhaite retrouver un même caractère à une position différente dans la chaine ? Je m'explique :
Le mot "informatique" contient deux "i", je souhaite préciser à mon regex que le premier et le neuvième caractère sont les mêmes. Comment faire ?
Quelque chose du genre, ou X représente un même caractère...
Regex pour trouver la chaine "informatique" : "X.{7}X.{3}"
Quelle est la notation ?
Merci à la communauté.
Dernière modification par wolf85kunst (Le 10/09/2010, à 15:33)
Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --
Hors ligne
#15 Le 10/09/2010, à 15:42
- ehmicky
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Tu utilises les opérateurs \1, \2, etc., comme tu les utiliserais avec sed ou autre.
Par exemple, si tu veux cibler un fichier dans le répertoire courant dont le nom est "gaga", "gogo" ou "gigi", mais pas "gagi" ou "goga", tu peux faire :
find -regextype "posix-extended" -iregex "g([aoi])g\1"
Le \1 fait référence à la dernière expression entre parenthèses, \2 à la seconde, etc.
Les parenthèses peuvent s'inclure mutuellement.
Edit :
enfin, en complément d'information si le sujet des regexps t'intéressent, en restant concentré sur le Bash et les commandes Unix, tu as ces autres utilités avec lesquelles tu pourras utiliser les regexps étendues : grep -r, sed, awk, l'opérateur de test =~ introduit par Bash 4, run-parts --regex, whatis -r, diff -I, locate -regex, etc.
Dernière modification par ehmicky (Le 10/09/2010, à 15:48)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#16 Le 10/09/2010, à 15:51
- wolf85kunst
Re : La commande "Find" couplé avec une expression régulière [RESOLU]
Encore merci à tous ceux qui ont participé à ce post.
Bonne fin de journée à tous.
Dernière modification par wolf85kunst (Le 10/09/2010, à 15:52)
Les raisonnables ont duré, les passionnés ont vécu.
-- 10.04 Lucid Lynx --
Hors ligne