Подтвердить что ты не робот

Игнорировать регистр в glob() в Linux

Я пишу script, который должен будет работать с каталогами, которые модифицируются вручную пользователями Windows и Linux. Пользователи Windows обычно не интересуются случаем при назначении имен файлов.

Есть ли способ справиться с этим на стороне Linux в Python, то есть я могу получить нечувствительное к регистру поведение в виде глобуса?

4b9b3361

Ответ 1

Используйте не зависящие от регистров регулярные выражения вместо шаблонов glob. fnmatch.translate генерирует регулярное выражение из шаблона glob, поэтому

re.compile(fnmatch.translate(pattern), re.IGNORECASE)

дает нечувствительную к регистру версию шаблона glob как скомпилированный RE.

Имейте в виду, что если файловая система размещается в ящике Linux в Unix-подобной файловой системе, пользователи смогут создавать файлы foo, foo и foo в том же каталоге.

Ответ 2

Вы можете заменить каждый алфавитный символ c на [cC], через

import glob
def insensitive_glob(pattern):
    def either(c):
        return '[%s%s]'%(c.lower(),c.upper()) if c.isalpha() else c
    return glob.glob(''.join(map(either,pattern)))

Ответ 3

Не рекурсивно

Чтобы получить файлы (и только файлы) каталога "путь" с помощью "globexpression":

list_path = [i for i in os.listdir(path) if os.path.isfile(os.path.join(path, i))]
result = [os.path.join(path, j) for j in list_path if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]

Рекурсивный

с прогулкой:

result = []
for root, dirs, files in os.walk(path, topdown=True):
  result += [os.path.join(root, j) for j in files \
             if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]

Лучше также скомпилировать регулярное выражение, поэтому вместо

re.match(fnmatch.translate(globexpression)

do (перед циклом):

reg_expr = re.compile(fnmatch.translate(globexpression), re.IGNORECASE)

а затем замените в цикле:

  result += [os.path.join(root, j) for j in files if re.match(reg_expr, j)]

Ответ 4

В зависимости от вашего случая вы можете использовать .lower() для обоих шаблонов файлов и результатов из списка папок и только затем сравнить шаблон с именем файла