2017-06-14 12 views
1

En utilisant egrep, l'expression régulière "^ {8} de $" correspond à un nom de fichier d'exactement 8 caractères:trouver -regex ne pas reconnaître ce qui semble être une bonne requête

[email protected]:~/smsn+/kb/vcs/private$ ls | egrep "^.{8}$" 
ac7t6-Xo 
aQsqsC4- 
a_wzemGk 
[email protected]:~/smsn+/kb/vcs/private$ 

Mais en utilisant find, si je l'utilise posix-étendue ou le genre ordinaire, ce modèle ne fonctionne pas:

[email protected]:~/smsn+/kb/vcs/private$ find . -regex "^.{8}$" 
[email protected]:~/smsn+/kb/vcs/private$ find . -regextype posix-extended -regex "^.{8}$" 
[email protected]:~/smsn+/kb/vcs/private$ 

En fait, j'essayé tous les autres regextypes - emacs, posix-base, posix-awk, posix-egrep - comme indiqué here.

+1

Pourquoi ne pas simplement '' ls ????????? – Barmar

+0

Je ne connaissais pas les caractères génériques pris en charge par 'ls'. Merci! –

+1

Les caractères génériques sont développés par le shell, de sorte que chaque commande les prend en charge automatiquement. – Barmar

Répondre

2

Il ne fonctionne pas parce que la production de find comprendra également ./ avant chaque nom de fichier depuis votre argument de chemin est .

Vous pouvez utiliser:

find . -regextype posix-extended -regex "^[^/]{10}$" 

Ou bien:

find . -regextype posix-extended -regex "^\./[^/]{8}$" 

l'utilisation de [^/] au lieu de . garantit que nous ne correspondons pas aux noms de fichiers dans subdir ectories.

Ou nous pourrions utiliser -maxdepth 1 et pour éviter apparié dans les sous-répertoires:

find . -maxdepth 1 -regextype posix-extended -regex "^\./.{8}" 
+0

Notez que cela correspondra aux noms de fichiers dans les sous-répertoires, si la longueur combinée est 8, par ex. './foo/1234' – Barmar

+0

Oui, c'est vrai puisque' .' correspond ''/''. OP peut utiliser: '[^ /] {8}' au lieu de '. {8}' – anubhava