Я не нашел много информации об этом, насколько я знаю, это рекурсивно сопоставляет имена файлов и каталогов, но как это работает?
Не забудьте включить его с помощью shopt -s globstar
. Для отключения используйте shopt -u globstar
См. глобус в вики Грега.
Linux использует регулярное выражение с некоторыми командами, такими как grep или найти. Как вы говорите, ls или find * рекурсивно покажет все файлы и каталоги.
Подстановочный знак "*" означает: показывает все, что было до этого
Если вы используете ls "*", он покажет весь путь, который раньше ничего не содержал, Итак, все пути в текущем каталоге.
*
в этом контексте не имеет отношения к символу, используемому в регулярных выражениях.
Шарики не являются регулярными выражениями, и ОП запрашивает специальный шаблон шарика (**
) в bash, на который ваш пост не отвечает.
Кроме того, ls "*"
с кавычками просто перечисляет все файлы, имя которых буквально состоит из одного символа *
.
Выражение glob **
используется для сопоставления всех файлов и с нулевым или более каталогами и подкаталогами. Если за шаблоном следует /
, совпадают только каталоги и подкаталоги.
Это означает, что он используется в рекурсивном поиске файлов во время шаблонов расширения имени пути в командной строке.
В зависимости от оболочки, которую вы используете, ее необходимо включить. В bash это делается с помощью:
$ shopt -s globstar
Вот примеры:
# list all files recursively
$ echo **
# list all files recursively that end with .txt
$ echo **/*.txt
# list all files recursively that are in a subdirectory foo
$ echo **/foo/**
Имейте в виду, что следующий шаблон не работает рекурсивно **.txt
. Это выглядит как комбинация двух одиночных звездочек и идентична *.txt
.
Примечание: есть тонкие различия между bash и zsh, но в целом все работает одинаково.
См. соответствие bash globstar