【问题标题】:Find Non-UTF8 Filenames on Linux File System在 Linux 文件系统上查找非 UTF8 文件名
【发布时间】:2010-10-12 01:06:44
【问题描述】:

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

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

我一直在努力追随,但没有成功。

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

我正在使用 Fedora Code 9。

【问题讨论】:

  • 为什么他们只允许这些字符?其他的也很好,只要编码正确

标签: regex linux find grep


【解决方案1】:
find . | perl -ne 'print if /[^[:ascii:]]/'

【讨论】:

  • 如果某些东西不是 ascii,它不是男人,它不是 utf。
  • 示例:emil@galeon:/tmp/expermients$ ls laka.txt łąka.txt emil@galeon:/tmp/expermients$ find . | perl -ane '{ if(m/[[:^ascii:]]/) { print } }' ./łąka.txt` 而“łąka.txt”是正确的 utf8 编码名称。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    危险,shell 逃逸!

    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
    

    【讨论】:

    • 在这种情况下,单引号会更好。
    • 如果这不允许 UTF-8,对 OP 的请求不是完全没用吗?他们试图禁止 non UTF-8 文件名。
    【解决方案4】:

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

    【讨论】:

    • 我有 1000 多个使用 Windows 1252 编码和许多变音符号的文件。 “convmv -r -f cp1252 -t utf8 --notes 。”为我工作。不知道有这样的节目。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2011-11-27
    • 2010-10-05
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多