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$ 

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

  • Как найти первый гласный в строке
  • Заказ между `nohup`,` & `и перенаправление?
  • Как я могу перейти в каталог на определенной глубине в текущем дереве?
  • Как сделать косвенную переменную
  • Как вставить содержимое файла в строку в bash
  • проверка аргумента для сценария bash - это строка из всех цифр
  • Примечание. Я знаю, что я могу использовать for цикла с помощью команды [ или find , но я пытаюсь выяснить, что extglob .

  • Удаление всех гласных, но первый из набора строк
  • Как запустить «find -exec <script> {} \;
  • Как реализовать циклический поток данных между взаимосвязанными командами?
  • Как проверить, открыт ли конкретный порт на машине из сценария оболочки и выполнить действие на основе этого?
  • Сортировка с неравными пробелами в первом столбце
  • Команда для отображения содержимого каталога или вывода содержимого в файл?
  • 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 *(-^/) 

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

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