Как я могу перечислить файлы с именем файла, оканчивающимся на последний символ и с .txt
расширением?
Я попытался , ls *+([[:digit:]]).txt
но это верно для abc12.txt
и abc2.txt
.
Но мне нужно только получить abc2.txt
. Как я могу это сделать?
Есть ли какая-то форма, :digit:
которая это сделает?
shopt -s extglob
.Ответы:
Как насчет:
В
!
начале группы дополняет ее значение.Как отмечено в комментариях, это делает bash, попробуйте, например:
источник
ls
) не поддерживает регулярные выражения здесь. Это выражения имени файла (Globbing) . Вы можете увидеть разницу уже в своем примере: здесь,*
подстановочный знак, которого нет в регулярных выражениях, где вы бы использовали.*
для достижения того же. Регулярные выражения намного мощнее, чем глобализация.Вопрос задан для регулярных выражений. Bash и, следовательно
ls
, не поддерживает регулярные выражения здесь. Он поддерживает выражения имен файлов ( Globbing ), форму подстановочных знаков. Регулярные выражения намного мощнее.Если вы действительно хотите использовать регулярные выражения, вы можете использовать
find -regex
так:По умолчанию поиск является рекурсивным, но
ls
это не так. Чтобы найти файлы только в текущем каталоге, вы можете отключить рекурсию с помощью-maxdepth 1
. Найти совпадения с именем файла с путем, поэтому имена файлов начинаются с,./
если вы запускаете поиск в.
. Регулярное выражение начинается с того,\./
чтобы справиться с этим. Обратите внимание, что в регулярном выражении.
это специальный символ, соответствующий любому символу, но здесь нам действительно нужна точка, поэтому мы избегаем ее с обратной косой чертой. Мы делаем то же самое для точки.txt
, потому что в противном случае регулярное выражение также будет соответствоватьAtxt
. Классы цифр такие же, как и для глобализации, они вам нужны^
вместо того,!
чтобы инвертировать класс символов.Если вы хотите получить вывод
ls
, то вы можете использовать-exec ls
так:find
поддерживает несколько различных вкусов регулярных выражений. Вы можете указать-regextype
, например:Для меня возможные типы: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Вы можете запустить,
find -regextype help
чтобы узнать, что поддерживается в вашей системе.источник
С расширенными глобусами (или
bash -O extglob
илиzsh -o kshglob
) ksh, которые вы уже используете, это будет:Или
Если вы хотите , чтобы соответствовать на
a1.txt
и2.txt
, но неa12.txt
ни12.txt
.Однако обратите внимание, что в ksh и bash (если вы не установите
failglob
опцию для получения поведения, подобного zsh), если этот шаблон не соответствует ни одному файлу, шаблон будет передан буквальноls
, и если этот файл (со странным именем) произойдет существует, он будет указан в списке,ls
даже если он не соответствует самому шаблону.Чтобы включить
.2.txt
, установитеdotglob
параметр вbash
, добавьте(D)
Глобы классификатор вzsh
или наборFIGNORE
для!(.|..)
вksh93
.источник