8

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

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

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

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

我正在使用 Fedora Code 9。

4

4 回答 4

16

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

于 2009-03-08T16:03:30.950 回答
8
find . | perl -ne 'print if /[^[:ascii:]]/'
于 2012-02-01T09:48:25.187 回答
2

寻找 。| 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
于 2009-03-08T16:25:39.710 回答
-1

我遇到了与 OP 类似的问题,我在 Superuser 上获得了一个解决方案(另请参阅进一步的评论),我发现它比“convmv 解决方案”更令人满意,尽管我很高兴也发现了 comvmv。

于 2010-11-28T05:17:44.840 回答