Чем отличаются /** и / * с точки зрения навигации по каталогам в 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.