在Linux文件系统上查找非UTF8文件名

时间:2009-03-08 15:57:56

标签: regex linux find grep

O / S = Fedora Code 9。

我的LANG = en_US:UTF-8文件系统中隐藏了许多文件,这些文件已在文件名中上传了无法识别的字符。

我需要搜索文件系统并返回至少有一个字符不在标准范围内的文件名(a-zA-Z0-9和。-_等)

我一直在努力追随但没有运气。

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

欢迎所有建议。

干杯,

AP。

4 个答案:

答案 0 :(得分:13)

convmv可能会让您感兴趣。它不仅可以找到这些文件,还支持将它们重命名为正确的文件名(如果它可以猜出出了什么问题)。

答案 1 :(得分:7)

find . | perl -ane '{ if(m/[[:^ascii:]]/) { print } }'

答案 2 :(得分:1)

  找到。 | egrep [^ a-zA-Z0-9 _./- \ s]

危险,炮弹逃跑!

bash将解释最后一个参数,删除一个反斜杠转义级别。尝试在“[^ group]”表达式周围加上双引号。

当然,这也不允许比UTF-8更多。构造正则表达式以匹配有效的UTF-8字符串是possible,但它相当丑陋。如果你有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

答案 3 :(得分:0)

我在OP上遇到了类似的问题,我在超级用户上获得solution(另请参阅further comments),我发现比“convmv解决方案”更令人满意,尽管我很欣赏发现了comvmv。