Использование расширения скобок

Использование расширения скобок

Итак, по сути, я хочу объединить эти две строки cmd вместе.

ls *[Aa]* 
ls *[Bb]*

Я ищу файл, содержащий как буквы A, так и B (в нижнем или верхнем регистре), и они могут встречаться более одного раза.

Вот что я попробовал:

ls *[Aa]*&&*[Bb]*

решение1

Использование расширения скобок

Один из методов — использовать расширение скобок. Рассмотрим каталог с этими файлами:

$ ls
1a2a3  1a2b3  1b2A3  1b2b3

Чтобы выбрать те, которые содержат и в том, aи bв другом случае:

$ ls *{[bB]*[aA],[aA]*[bB]}*
1a2b3  1b2A3

Улучшение

Возможная проблема заключается в том, как ведет себя расширение скобок, если у одного из вариантов нет соответствующих файлов. Рассмотрим каталог с этими файлами:

$ ls
1a2a3  1b2A3  1b2b3

Теперь давайте выполним нашу команду:

$ ls *{[bB]*[aA],[aA]*[bB]}*
ls: cannot access '*[aA]*[bB]*': No such file or directory
1b2A3

Если нам не нравится это предупреждающее сообщение, мы можем установить nullglob, и оно исчезнет:

$ shopt -s nullglob
$ ls *{[bB]*[aA],[aA]*[bB]}*
1b2A3

Однако ограничение этого подхода заключается в том, что если ни один из шаблонов не совпадает, то lsон запускается без аргументов и, следовательно, выводит список всех файлов.

Использование расширенных глобусов

Давайте снова рассмотрим каталог с этими файлами:

$ ls
1a2a3  1a2b3  1b2A3  1b2b3

Теперь давайте установим extglob:

$ shopt -s extglob

Давайте воспользуемся расширенным глобальным поиском для поиска наших файлов:

$ ls *@([bB]*[aA]|[aA]*[bB])*
1a2b3  1b2A3

решение2

Если вы не против позвать grepна помощь, то

ls *[aA]* | grep -i b

тоже подойдет.

Связанный контент