La question demandait des expressions régulières. Bash, et donc ls
, ne prend pas en charge les expressions régulières ici. Il prend en charge les expressions de nom de fichier ( Globbing ), une forme de caractères génériques. Les expressions régulières sont beaucoup plus puissantes que cela.
Si vous voulez vraiment utiliser des expressions régulières, vous pouvez utiliser find -regex
comme ceci:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
La recherche est récursive par défaut, mais ls
ne l'est pas. Pour rechercher uniquement des fichiers dans le répertoire en cours, vous pouvez désactiver la récursivité avec -maxdepth 1
. Trouver des correspondances avec le nom de fichier avec chemin d'accès, c'est pourquoi les noms de fichiers commencent par ./
si vous exécutez find in .
. Le regex commence par \./
faire face à cela. Notez que dans une expression régulière, .
est un caractère spécial correspondant à n'importe quel caractère, mais ici, nous voulons vraiment un point, c'est pourquoi nous l'échappons avec une barre oblique inverse. Nous faisons la même chose pour le point dedans .txt
, car autrement l'expression régulière correspondrait également Atxt
. Les classes de chiffres sont les mêmes que pour la globalisation, juste ce dont vous avez besoin ^
au lieu d' !
inverser la classe de caractères.
Si vous voulez obtenir la sortie de ls
, vous pouvez utiliser -exec ls
comme ceci:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
prend en charge plusieurs saveurs regex différentes. Vous pouvez spécifier un -regextype
, par exemple:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Pour moi, les types possibles sont: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Vous pouvez exécuter find -regextype help
pour découvrir ce qui est pris en charge sur votre système.
shopt -s extglob
.