
Итак, по сути, я хочу объединить эти две строки 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
тоже подойдет.