Как написать один миниатюрный шарик, который соответствует всем js-файлам, не входящим в каталог

У меня есть ситуация, когда мне нужен один шаблон глобуса (который использует minimatch) для сопоставления всех файлов JavaScript, которые не находятся в определенном каталоге. К сожалению, я использую другой инструмент, который не предоставляет никаких опций (например, ignore шар), так что это должен быть один шар, чтобы сделать работу.

Вот что у меня пока

скриншот globtester

Пример ввода (он не должен соответствовать верху, но должен соответствовать низу):

docs/foo/thing.js
docs/thing.js
client/docs/foo/thing.js
client/docs/thing.js

src/foo/thing.js
src/thing.js
docs-src/foo/thing.js
docs-src/thing.js
client/docs-src/foo/thing.js
client/docs-src/thing.js

И вот что у меня есть для паттерна глобуса:

**/!(docs)/*.js

С этим я сопоставляю docs/foo/thing.js а также client/docs/foo/thing.js и не совпадает docs-src/thing.js или же client/docs-src/thing.js, Если я переключу свой шар на **/!(docs)/**/*.js тогда я могу соответствовать client/docs-src/thing.js но я тоже подхожу client/docs/thing.js,

Я не уверен, что это возможно, поэтому мне может понадобиться найти другое решение для моей проблемы:-/

2 ответа

Решение

Я думаю, что вы можете столкнуться с ограничением minimatch (или любой реализации fnmatch(3)) и globstar. Возможно, стоит отметить, что ни одна реализация fnmatch на C, о которой я знаю, на самом деле не реализует globstar, но, поскольку значения fnmatch (включая minimatch) служат интересам их глобаторов, это может варьироваться.

Шар, который, по вашему мнению, должен работать, действительно работает, когда используется как шар.

$ find . -type f
./docs/foo/thing.js
./docs/thing.js
./docs/nope.txt
./docs-src/foo/thing.js
./docs-src/thing.js
./x.sh
./client/docs/foo/thing.js
./client/docs/thing.js
./client/docs/nope.txt
./client/docs-src/foo/thing.js
./client/docs-src/thing.js
./client/docs-src/nope.txt
./client/nope.txt
./src/foo/thing.js
./src/thing.js

$ for i in ./!(docs)/**/*.js; do echo $i; done
./client/docs-src/foo/thing.js
./client/docs-src/thing.js
./client/docs/foo/thing.js
./client/docs/thing.js
./docs-src/foo/thing.js
./docs-src/thing.js
./src/foo/thing.js
./src/thing.js

$ node -p 'require("glob").sync("./!(docs)/**/*.js")'
[ './client/docs-src/foo/thing.js',
  './client/docs-src/thing.js',
  './client/docs/foo/thing.js',
  './client/docs/thing.js',
  './docs-src/foo/thing.js',
  './docs-src/thing.js',
  './src/foo/thing.js',
  './src/thing.js' ]

РЕДАКТИРОВАТЬ: О, я вижу, вы хотите сопоставить вещи на любой глубине папки, которые не имеют docs части пути в любом месте пути. Нет, это невозможно сделать способом, который поддерживает произвольную глубину, например, в виде шарика или шаблона мини-соответствия. Вам придется использовать исключение или создать глобус, который выглядит следующим образом: {!(docs),!(docs)/!(docs),!(docs)/!(docs)/!(docs),!(docs)/!(docs)/!(docs)/!(docs)}/*.js

В противном случае путь как x/docs/y/z.js будет соответствовать **/!(docs)/**/*.js говоря, что первый ** ничего не соответствует, !(docs) соответствует x, следующий ** соответствует docs/y а потом *.js соответствует z.js,

Я подошел ближе со следующим:

**/?(docs*[a-zA-Z0-9]|!(docs))/*.js

globtester

Все еще пытаюсь заставить его работать на произвольную глубину.

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