Вопрос задан для регулярных выражений. Bash и, следовательно ls, не поддерживает регулярные выражения здесь. Он поддерживает выражения имен файлов ( Globbing ), форму подстановочных знаков. Регулярные выражения намного мощнее.
Если вы действительно хотите использовать регулярные выражения, вы можете использовать find -regexтак:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
По умолчанию поиск является рекурсивным, но lsэто не так. Чтобы найти файлы только в текущем каталоге, вы можете отключить рекурсию с помощью -maxdepth 1. Найти совпадения с именем файла с путем, поэтому имена файлов начинаются с, ./если вы запускаете поиск в .. Регулярное выражение начинается с того, \./чтобы справиться с этим. Обратите внимание, что в регулярном выражении .это специальный символ, соответствующий любому символу, но здесь нам действительно нужна точка, поэтому мы избегаем ее с обратной косой чертой. Мы делаем то же самое для точки .txt, потому что в противном случае регулярное выражение также будет соответствовать Atxt. Классы цифр такие же, как и для глобализации, они вам нужны ^вместо того, !чтобы инвертировать класс символов.
Если вы хотите получить вывод ls, то вы можете использовать -exec lsтак:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
findподдерживает несколько различных вкусов регулярных выражений. Вы можете указать -regextype, например:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Для меня возможные типы: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Вы можете запустить, find -regextype helpчтобы узнать, что поддерживается в вашей системе.
shopt -s extglob.