Начать глобус с шаблоном исключения

Я пытаюсь настроить некоторое завершение . Предположим, что у меня есть:

$ ls bar.baz foo_bar.baz foo.bar 

Если я хочу, чтобы завершение соответствовало всем файлам, которые не заканчиваются в baz:

 $ shopt|grep extglob extglob on $ compgen -G "*.!(baz)" foo.bar 

Исключительный glob работает так, как ожидалось. Но если мне нужны все файлы, которые не начинаются с foo:

 $ compgen -G "!(foo)*" bar.baz foo.bar foo_bar.baz 

Все файлы по-прежнему совпадают. Предположительно, это потому, что * может все еще расширяться, чтобы соответствовать foo . Есть ли какой-либо трюк, чтобы использовать исключение, за которым следует * ?

Как отметил Янис, исключая foo, нужно быть !(foo*) , но фактический прецедент также должен совпадать с расширением, поэтому glob должен быть в основном из формы !(foo*)*.bar (который все еще не удается исключить префиксы «foo»).

  • Cygwin использует подстановочный знак для обрезания всех изображений
  • Невозможно выполнить команду внутри переменной bash, включая квадратные скобки с нулевым ключом
  • find delete shows "Нет такого файла или каталога"
  • Найти команду: путь к файлу vs -name Аргумент
  • Получите количество файлов, которые соответствуют шаблону в каталоге, и удалите самый старый
  • du skip символические ссылки
  • lftp исключает путаницу синтаксиса
  • Почему `find` иногда находит мой файл, иногда не
  • One Solution collect form web for “Начать глобус с шаблоном исключения”

    Вы должны включить * в отрицание, например:

     ls !(foo*) 

    Изменить (уточнить): запрошенный шаблон расширенного шаблона !(foo*) . Если используется с командой compgen вызов будет, например:

     compgen -G "!(foo*)" 

    Вам нужны кавычки, чтобы передать шаблон команде compgen unpanded.

    Изменить (после изменения вопроса): для вашего полного шаблона в отредактированном вопросе попробуйте один из @(!(foo*)|*bar) или @(!(bar*)|*foo) . (См. Мой комментарий ниже, если это не то, что вы ожидаете.)

    Linux и Unix - лучшая ОС в мире.