exglob отрицание не работает как ожидалось

Я пытался использовать отрицание, чтобы исключить каталоги из globbing, но каталоги все еще отображаются в соответствии с шаблоном:

bash-4.3$ ls file_1.txt testdir bash-4.3$ shopt extglob extglob on bash-4.3$ echo !(*/) file_1.txt testdir bash-4.3$ 

Что я делаю неправильно?

Примечание. Я знаю, что я могу использовать for цикла с помощью команды [ или find , но я пытаюсь выяснить, что extglob .

  • Есть ли инструмент командной строки для управления сигналами unix?
  • Сценарий Bash с conf-файлом с неизвестным числом наборов переменных
  • Bash .hushlogin, сохранить последнее время входа и хост
  • Есть ли линейная труба bash?
  • Есть ли способ заставить «mv» терпеть неудачу?
  • Закрыть / убить / скрыть одно окно терминала в bash on 'process complete'
  • сценарий оболочки с интересной ошибкой
  • В linux, как удалить все файлы ЗА ИСКЛЮЧЕНИЕМ шаблона * .txt?
  • One Solution collect form web for “exglob отрицание не работает как ожидалось”

    Вы не можете иметь / в @(...) !(...) , *(...)

    Параметр / может появляться только между глобами, даже a[x/y]b рассматривается как @(a\[x)/@(y\]b) . globs сначала разбиваются на / а каждая часть сопоставляется с содержимым каталога. Однако, если существуют расширения x(...) ksh glob, внутри / которые находятся внутри (...) , нет разделения, но каждая часть glob по-прежнему сопоставляется с именами файлов. In !(*/*) , */* Сопоставляется с каждым именем файла в текущем каталоге. Очевидно, что ни одно имя файла не может содержать / , поэтому оно ничего не соответствует, поэтому !(*/*) Соответствует каждому файлу.

    Здесь вы хотите использовать zsh и его квалификаторы glob:

     echo *(^/) 

    Для файлов любого типа, кроме каталога. Или быть противоположным bash */ (который является любым файлом каталога типов после разрешения symlink ):

     echo *(-^/) 

    (файлы, которые не являются ни каталогами, ни символическими ссылками на каталоги).

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