2016-11-12 6 views
0

Я хочу найти файлы определенных типов под каталогом. Часть расширения может иметь комбинацию случайных символов.Path.wildcard/2 нечувствительных к регистру соответствия

Path.wildcard("/...some path.../**/*.MPG") 

В приведенном выше примере будет возвращать только файлы с расширением в верхнем регистре .MPG, в то время как я хотел бы также Получить downcase .mpg файлы вместе с тем, что дело комбинаций могло произойти.

Есть ли способ сделать это без перечисления всех возможных комбинаций случаев в glob? Я бы хотел, чтобы это работало на Windows, Linux и OS X.

ответ

1

Вы можете использовать квадратные скобки, чтобы выразить это в O(n) символах, а не перечислять все комбинации, которые будут O(n!). В этом случае, вы можете сделать:

Path.wildcard("/...some path.../**/*.[mM][pP][gG]") 

Вы также можете создать функцию, чтобы сделать это автоматически для вас:

defmodule Main do 
    def ci(<<char::utf8, rest::binary>>) do 
    char = <<char::utf8>> 
    "[#{String.downcase(char)}#{String.upcase(char)}]" <> ci(rest) 
    end 
    def ci(""), do: "" 

    def main do 
    IO.inspect "*.#{ci("mpg")}" 
    Path.wildcard "*.#{ci("mpg")}" 
    end 
end 

Main.main 
$ ls | grep -i mpg 
bar.mpG 
baz.mpg 
foo.MPG 
$ elixir a.exs 
"*.[mM][pP][gG]" 
["bar.mpG", "baz.mpg", "foo.MPG"] 
+0

Я попытался квадратные скобки подход до и по какой-то причине это не сработало для меня. Теперь, возможно, я где-то ошибся. Благодаря! –

+0

@ Dogbert, как мы обрабатываем случаи, когда «какой-то путь» есть «Some Path» или «Some path» или «SOME PATH»? https://stackoverflow.com/questions/45597018/how-to-perform-a-case-insensitive-file-search-in-erlang-elixir –

Смежные вопросы