web-dev-qa-db-fra.com

regex correspond à chaque chaîne dans la commande linux "find"

J'essaie ce qui suit pour rechercher récursivement des fichiers se terminant par .py ou .py.server:

$ find -name "stub*.py(|\.server)"

Cependant, cela ne fonctionne pas.

J'ai essayé des variantes comme:

$ find -name "stub*.(py|py\.server)"

Ils ne fonctionnent pas non plus.

Un simple find -name "*.py" fonctionne, alors comment se fait-il que regex ne fonctionne pas?

20
Reut Sharabani

Dire:

find . \( -name "*.py" -o -name "*.py.server" \)

Le dire entraînerait la correspondance des noms de fichiers *.py et *.py.server.

De man find:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

EDIT: si vous souhaitez spécifier une expression régulière, utilisez le -regex option:

find . -type f -regex ".*\.\(py\|py\.server\)"
34
devnull

La recherche peut prendre un modèle d'expression régulière:

$ find . -regextype posix-extended -regex '.*[.]py([.]server)?$' -print

Options:

-modèle regex

Le nom de fichier correspond au modèle d'expression régulière. C'est une correspondance sur tout le chemin, pas une recherche. Par exemple, pour faire correspondre un fichier nommé ./fubar3', you can use the regular expression.*bar.' ou .*b.*3', but notf. * r3 '. Les expressions régulières comprises par find sont par défaut les expressions régulières Emacs, mais cela peut être modifié avec l'option -regextype.

-imprimer vrai;

imprimer le nom de fichier complet sur la sortie standard, suivi d'une nouvelle ligne. Si vous transférez la sortie de find dans un autre programme et qu'il y a la moindre possibilité que les fichiers que vous recherchez contiennent une nouvelle ligne, alors vous devriez sérieusement envisager d'utiliser l'option -print0 au lieu de -print. Consultez la section NOMS DE FICHIERS INHABITUELS pour plus d'informations sur la façon dont les caractères inhabituels dans les noms de fichiers sont traités.

-regextype type

Modifie la syntaxe des expressions régulières comprise par les tests -regex et -iregex qui se produisent plus tard sur la ligne de commande. Les types actuellement implémentés sont emacs (c'est la valeur par défaut), posix-awk, posix-basic, posix-egrep et posix-extended.

Un plus clair description ou les options. N'oubliez pas que toutes les informations peuvent être trouvées en lisant man find ou info find.

6
Chris Seymour

trouver -name n'utilise pas regexp, voici un extrait de la page de manuel sur Ubuntu 12.04

-name pattern
              Base of  file  name  (the  path  with  the  leading  directories
              removed)  matches  Shell  pattern  pattern.   The metacharacters
              (`*', `?', and `[]') match a `.' at the start of the  base  name
              (this is a change in findutils-4.2.2; see section STANDARDS CON‐
              FORMANCE below).  To ignore a directory and the files under  it,
              use  -Prune; see an example in the description of -path.  Braces
              are not recognised as being special, despite the fact that  some
              shells  including  Bash  imbue  braces with a special meaning in
              Shell patterns.  The filename matching is performed with the use
              of  the  fnmatch(3)  library function.   Don't forget to enclose
              the pattern in quotes in order to protect it from  expansion  by
              the Shell.

Donc, le modèle qui -name prend est plus comme un glob de Shell et pas du tout comme une expression régulière

Si je voulais trouver par regexp je ferais quelque chose comme

find . -type f -print | egrep 'stub(\.py|\.server)'
4
Vorsprung