Comment utiliser les regex avec la commande rechercher?
J'ai quelques images nommés avec générés uuid1 chaîne. Par exemple 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Je veux trouver toutes ces images à l'aide de commande "find":
find . -regex "[a-f0-9\-]\{36\}\.jpg".
Mais ça ne fonctionne pas. Quelque chose de mal avec l'expression régulière? Quelqu'un pourrait-il m'aider?
- peut-être modifier la regextype. La valeur par défaut est Emacs Expressions Régulières, quoi que cela signifie.
- stackoverflow.com/questions/5635651/linux-find-regex
Vous devez vous connecter pour publier un commentaire.
Notez que vous devez spécifier
.*/
au début parce quefind
correspond au chemin d'accès complet.Exemple:
Ma version de find:
find: Unknown regular expression type sed; valid types are findutils-default, awk, egrep, emacs, gnu-awk, grep posix-awk, posix-basic, posix-egrep, posix-extended
"^ ... $"
entourant votre regex. Elle doit correspondre à la TOTALITÉ du résultat de la ligne.-regextype sed
est la seule chose qui semble fonctionner. Autant que je sache,-regextype egrep
devrait également travailler parce queegrep
prend en charge la répétition compte, mais pour quelque raison il ne le fait pas.posix-egrep
fonctionne pour moi./
dans.*/
parce que.*
correspond à zéro ou plus de (presque) n'importe quel caractère.\{36\}
'-E'
et'-regex'
out. Ici est un exemple.find -E . -regex ".*\/[a-f0-9\-]{36}\.png"
-E
, est l'équivalent de-regextype egrep
valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
-name
ne peut pas être utilisé avec des expressions régulières dansfind
?-regextype
drapeau avant le-regex
drapeau, sinon elle ne s'applique pas!La
-regex
trouver l'expression correspond à la nom entier, y compris le chemin relatif à partir du répertoire courant. Pourfind .
cela commence toujours avec./
, puis tous les répertoires.Aussi, ce sont
emacs
expressions régulières, qui ont d'autres échapper à des règles que l'habitude egrep expressions régulières.Si elles sont toutes directement dans le répertoire courant, puis
devrait fonctionner. (Je ne suis pas vraiment sûr - je ne peux pas obtenir le compte de la répétition à l'œuvre ici.) Vous pouvez passer à egrep expressions par
-regextype posix-egrep
:(À noter que tout ce qui est dit ici est pour GNU trouver, je ne sais rien à propos de la BSD qui est aussi la valeur par défaut sur Mac.)
posix-egrep
type a fonctionné pour moi.-regextype
est une option pour GNUfind
et pas BSD (au moins pas de Mac BSD-like)find
. Si cette option n'est pas disponible, assurez-vous d'installer GNU trouver. Sur un Mac, c'est possible avec l'infusion paquetfindutils
. Trouver est alors disponible viagfind
.À en juger par les autres réponses, il semble que cela pourrait être de trouver la faute.
Cependant, vous pouvez le faire de cette façon au lieu de cela:
find . * | grep -P "[a-f0-9\-]{36}\.jpg"
Vous pourriez avoir à modifier le grep un peu et utiliser les différentes options en fonction de ce que vous voulez, mais il fonctionne.
find
's-prune
fonctionnalité qui vous permet de sauter de certains répertoires complètement. Le plus souvent, ce n'est pas vraiment important, mais il vaut la peine de mentionner.Essayez d'utiliser les guillemets simples (') pour éviter de shell s'échapper de votre chaîne. Rappelez-vous que l'expression doit correspondre à l'ensemble de la trajectoire, c'est à dire doit ressembler à:
En dehors de cela, il semble que ma trouvaille (GNU 4.4.2) ne connaît de base des expressions régulières, et surtout pas l' {36} syntaxe. Je pense que vous avez à faire sans elle.
Simple - vous pouvez spécifier .* au début, de trouver des correspondances tout le chemin.
trouver la version
Vous devriez utiliser le chemin absolu d'un répertoire lors de l'application de trouver de l'enseignement, avec expression régulière.
Dans votre exemple, le
doit être modifié dans
Dans la plupart des systèmes Linux, certaines disciplines dans l'expression régulière ne peut pas être reconnu par le système, de sorte que vous devez explicitement point regexty comme
sur Mac OS X, BSD (trouver): Même accepté de répondre, le
.*/
préfixe est nécessaire pour correspondre à un chemin d'accès complet:man find
dit-E
utilise étendu regex soutien-E
n'est pas disponible sur Ubuntu (testé sur WSL Ubuntu)