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

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

$ 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»).

  • Переменные ls, regexp и environment
  • Невозможно выполнить команду внутри переменной bash, включая квадратные скобки с нулевым ключом
  • Передача всех файлов определенного типа файлов в текущие и подкаталоги
  • Почему `find` иногда находит мой файл, иногда не
  • Список файлов другого формата при поиске определенного шаблона имени
  • Есть ли какая-нибудь причина для двойного проверки результатов `find -type -f` с помощью оператора` -f` bash?
  • Почему rm * (1) * удаляет все файлы в каталоге?
  • Как я могу назначить вывод команды переменной оболочки?
  • One Solution collect form web for “Начать глобус с шаблоном исключения”

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

     ls !(foo*) 

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

     compgen -G "!(foo*)" 

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

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

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