Node-Minimatch/Regex: сопоставлять подкаталоги в указанном подкаталоге

Я хотел бы сопоставить все подпапки в данной подпапке.

Допустим, у меня есть следующие каталоги:

test/rock/martin
test/rock/steven
test/rock/steven/coolmusik
test/rock/steven/coolmusik/newmusic

test/pop/martin
test/pop/steven
test/pop/steven/mysubdir
test/pop/steven/anothersubdir

Теперь я хотел бы сопоставить все в "рок" и "поп", с ограничением данного имени. В данном случае это "Стивен".

До сих пор работает следующее мини -правило:

minimatch('./test', ['!*(rock|pop|steven)'], {matchBase: true}))

Перевод правила выше:

Скрыть все, что не в рок и поп и Стивен.


Но вот проблема: как вы можете себе представить, minimatch не включает подкаталоги в данном конкретном случае.

Я хочу, чтобы это было похоже на...

minimatch('./test', ['!*(rock|pop|steven|PLUS_SUBDIRS_OF_STEVEN)'], {matchBase: true}))

... но, к сожалению, это не сработало с моим правилом:

minimatch('./test', ['!*(rock|pop|steven/**)'], {matchBase: true}))

Мой вопрос: как я могу спрятать все вещи, кроме подкаталогов rock + pop + steven + steven?


Лучший обзор структуры каталогов:

test
|-rock
|--martin
|--steven
|---coolmusik
|----newmusic
|-pop
|--martin
|--steven
|---mysubdir
|---anothersubdir

Кроме того: если нет возможности minimatch справиться с этим, как будет выглядеть регулярное регулярное выражение для приведенных выше правил?

1 ответ

Вы не можете получить поведение в стиле.gitignore, составив список каждого файла, а затем сопоставив его каждому. Начнем с того, что это нелепо дорого (у вас может быть папка.gitignore'd с 100000 файлами в ней или что-то в этом роде), а также вы должны отслеживать, был ли родитель проигнорирован. Однако это усложняется, потому что правило может привести к тому, что вам придется искать конкретные элементы, если они не игнорируются правилом с отрицанием.

Источник: https://github.com/isaacs/minimatch/issues/8

Владелец minimatch написал модуль fstream-ignore, который решает эту проблему. Тем не мение. Это определенно выходит за рамки и не связано с моим вопросом. Я заканчиваю с регулярным регулярным выражением Javascript, как упомянуто в оригинальном посте.


Regex:

new RegExp(^test\/(rock|pop)(?:\/|$)(?:steven|$)(?:\/.*|$)$);

Пример:

var re = /^test\/(rock|pop)(?:\/|$)(?:steven|$)(?:\/.*|$)/mg;
var paths = 'test/rock/martin\ntest/rock/steven\ntest/rock/steven/coolmusik\ntest/rock/steven/coolmusik/newmusic\ntest/pop/martin\ntest/pop/steven\ntest/pop/steven/mysubdir\ntest/pop/steven/anothersubdir';

var match;

while ((match = re.exec(paths)) !== null) {
  if (match.index === re.lastIndex) {
    re.lastIndex++;
  }
  var old_content = document.getElementById('results').innerHTML;
  document.getElementById('results').innerHTML = old_content + '<br>' + match[0];
}
<b>Verify against:</b>
<pre>
test/rock/martin
test/rock/steven
test/rock/steven/coolmusik
test/rock/steven/coolmusik/newmusic

test/pop/martin
test/pop/steven
test/pop/steven/mysubdir
test/pop/steven/anothersubdir
</pre>

<br><hr><br>

<b>Get <u>steven</u>'s results</b>:
<div id="results"></div>

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