У меня есть эта структура каталогов:
~/tmp/globstar ɀ find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
и с globstar
включенной опцией в Bash я могу сказать:
~/tmp/globstar ɀ ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
Мой вопрос: почему dir/file.ext
исключен из этого списка?
Руководство Bash говорит об этом globstar
:
Если установлено, шаблон '**', используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов. Если за шаблоном следует знак «/», совпадут только каталоги и подкаталоги.
« Ноль » в этом абзаце позволил мне создать впечатление, что его dir/file.ext
следовало включить; если я не надеюсь что-то упустить.
ɀ
?unicode ɀ
или Википедияɀ
это просто символ, используемый здесь, чтобы отличить подсказку. Некоторые пользователи предпочитают персонажа£
или€
вместо$
:). Первоначально,ɀ
символ 'z', созданный для специальной нотации на африканском языке :-)Ответы:
Я предполагаю, что это относится только к уровню подкаталогов.
**
без/
спичеквсе файлы и каталоги
ноль или более подкаталогов
Но это не исчезает полностью.
**/
означает, что ни один из файлов в каталоге самого высокого уровня, к которому**
применяется, не сопоставлен.Вам нужно
dir/*.ext dir/**/*.ext
.источник
Это работает, как вы ожидали, в следующих версиях Bash, поставляемых со следующими дистрибутивами:
На самом деле перечисленные выше версии - это все, что я тестировал. Другими словами, я не нашел версию 4 Bash, где она не работает. Опция
globstar
была добавлена в Bash 4.0, см. ИЗМЕНЕНИЯ . В старых версиях командаshopt -s globstar
должна возвращать ошибку.тесты
1.
dir/**/*.ext
совпаденияdir/file.ext
:2.
**/*.ext
совпаденияfile.ext
:Подготовка среды для воспроизведения тестов выше:
источник
shopt -s globstar
.Я смотрю на меня так, как будто ты выключил Globstar. Это может быть включено следующим образом:
Он не только не будет соответствовать нулевым подкаталогам, но также не будет соответствовать двум подкаталогам:
С выключенным globstar ** в конечном итоге ведет себя так же, как *, поэтому
dir/**/*.ext
получает тот же результат, что иdir/*/*.ext
что иногда заставляет меня думать, что Globstar включен
проверьте текущую настройку Globstar следующим образом:
источник
shopt globstar
.