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?
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\)"
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 not
f. * 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
.
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)'