Чем отличаются /** и / * с точки зрения навигации по каталогам в Grunt?

Это довольно легко для вас, ребята, но я не могу найти однозначного / формального ответа на этот вопрос.

Предположим, мы находимся в каталоге А. Тогда,

"A / *", вероятно, означает: каждый файл и папка прямо внутри A.

Тогда "A / **" может означать: каждый файл и папку внутри A, а также каждый файл и папку непосредственно внутри каждого дочернего элемента, находящегося непосредственно внутри A. (По сути, расширение оператора / *, которое проходит на один уровень глубже от корневой папки? aka "/ **" = "/ * / *")

Моя терминология "прямо изнутри" может быть неправильной. Может быть, лучше сказать "прямой ребенок" или что-то, но вы поняли.

Тогда, что означает "A / ** / *"? Это равно "A / * / * / *"?

Хотя это кажется основным, это довольно запутанно, когда у меня нет формального определения операторов.

В настоящее время я использую Javascript и пытаюсь изменить Gruntfile. Но я думаю, что эти операторы могут возникнуть в любом контексте.

2 ответа

Решение

Такое поведение не свойственно JavaScript и не связано с какими-либо операторами: что касается JavaScript, то это просто строка.

Обработка такого расширения глобуса определяется конкретной библиотекой / потребителем. Для gruntjs это покрыто Grunt Globbing Patterns:

Часто нецелесообразно указывать все исходные пути к файлам по отдельности, поэтому Grunt поддерживает расширение имени файла (также известное как глобализация) через встроенные библиотеки node-glob и minimatch.

  • * соответствует любому количеству символов, но не /

  • ** соответствует любому количеству символов, в том числе /, пока это единственное в части пути

Все, что нужно знать большинству людей, это foo/*.js будет соответствовать всем файлам, заканчивающимся на.js в подкаталоге foo /, но foo/**/*.js будет соответствовать всем файлам, заканчивающимся на.js в подкаталоге foo / и всех его подкаталогах.

Как таковой (но обратитесь к конкретной документации!), /**/ обычно означает "соответствовать любой глубине каталогов" и /*/ или же /* означает "соответствовать одному каталогу или части файла".


Документация gruntjs немного расплывчата в отношении конкретной механики ** в стандарте "/**/*.x" шаблон, но ссылаясь на узел-глоб говорит:

Если "глобстар" (**) находится один в части пути, затем он ищет ноль или более каталогов и подкаталогов, ищущих совпадения. Он не сканирует каталоги с символическими ссылками.

[.. Символ двойной звезды] поддерживается в виде bsdglob и bash 4.3, где ** имеет особое значение, только если это единственное в части пути. То есть, a/**/b будет соответствовать a/x/y/b, но a/**b не буду.

Используя это знание, мы получаем эквивалентность (при использовании в качестве компонента пути) A/**/f с A/f, A/*/f, A/*/*/f и т. д. для каждого количества промежуточных каталогов.

Если ты видишь A/**/* это означает рекурсивный поиск по дереву каждой папки в папке A, Для получения дополнительной информации посмотрите основные команды файла стиля linux.

Другие вопросы по тегам