Найти имена файлов не-UTF8 в файловой системе Linux - PullRequest
4 голосов
/ 08 марта 2009

O / S = Fedora Code 9.

В моей LANG = en_US: UTF-8 файловой системе скрыто несколько файлов, которые были загружены с неузнаваемыми символами в имени файла.

Мне нужно выполнить поиск в файловой системе и вернуть все имена файлов, которые содержат хотя бы один символ, который не входит в стандартный диапазон (a-zA-Z0-9 и.-_ И т. Д.)

Я пытался следовать, но не повезло.

find . | egrep [^a-zA-Z0-9_\.\/\-\s]

Все предложения приветствуются.

Приветствия

AP.

Ответы [ 4 ]

13 голосов
/ 08 марта 2009

convmv может быть вам интересно. Он не только находит эти файлы, но и поддерживает их переименование, чтобы исправить имена файлов (если он может угадать, что пошло не так).

7 голосов
/ 01 февраля 2012
find . | perl -ane '{ if(m/[[:^ascii:]]/) { print } }'
1 голос
/ 08 марта 2009

найти. | egrep [^ a-zA-Z0-9 _./- \ s]

Опасность, оболочка убегает!

bash будет интерпретировать этот последний параметр, удаляя один уровень экранирования от обратной косой черты. Попробуйте поставить двойные кавычки вокруг выражения "[^ group]".

Также, конечно, это запрещает намного больше, чем UTF-8. возможно создать регулярное выражение для соответствия допустимым строкам UTF-8, но это довольно уродливо Если у вас есть Python 2.x, вы можете воспользоваться этим:

import os.path
def walk(dir):
    for child in os.listdir(dir):
        child= os.path.join(dir, child)
        if os.path.isdir(child):
            for descendant in walk(child):
                yield descendant
        yield child

for path in walk('.'):
    try:
        u= unicode(path, 'utf-8')
    except UnicodeError:
        # print path, or attempt to rename file
0 голосов
/ 28 ноября 2010

У меня была проблема, аналогичная ОП, для которой мне было дано решение на Superuser (см. Также дальнейшие комментарии ), которое я нашел более удовлетворительным, чем "решение convmv", хотя я ценю, что открыл comvmv тоже.

...