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

8

我有许多文件隐藏在我的LANG=en_US:UTF-8文件系统中,它们的文件名中包含无法识别的字符。

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

我一直在尝试以下方法,但没有成功。

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

我正在使用Fedora Code 9。

1
为什么他们只允许那些字符?其他字符也可以,只要它们被正确编码。 - Joachim Sauer
4个回答

17

convmv 可能会对您有所帮助。它不仅可以找到这些文件,还支持将它们重命名为正确的文件名(如果它能猜出哪里出了问题)。


1
我有1000多个使用Windows 1252编码的文件,其中有很多带有变音符号。 "convmv -r -f cp1252 -t utf8 --notest ." 对我很有用。我不知道还有这样的程序。谢谢! - sl0815

8
find . | perl -ne 'print if /[^[:ascii:]]/'

4
如果某个东西不是ASCII编码,并不意味着它不是UTF编码。 - Emiter
“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 编码名称。 - Emiter

2
“英译中:
find . | 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

在那种情况下,单引号会更好。 - Arafangion
1
如果这禁止使用UTF-8,那么对于OP的请求来说它完全没有用处,因为他们试图禁止UTF-8文件名。 - Chris L. Barnes

-1

我曾经遇到过与楼主类似的问题,后来在Superuser上得到了解决方案(另请参见更多评论),我发现这个方案比“convmv方案”更令人满意,尽管我也很感激能够发现convmv。


你应该在答案中始终写下解决方案,而不仅仅是提供链接。我认为你指的是 LANG=C find . -regex '.*[^a-zA-Z./-].*' 这个命令,但我个人认为它并不好,因为它会“检测”任何包含空格、数字、下划线或ASCII符号(如$)的文件名。 - bobpaul
你应该在答案中始终写下解决方案,而不仅仅是提供链接。我认为你指的是 LANG=C find . -regex '.*[^a-zA-Z./-].*',在我看来并不是很好,因为它会“检测”任何包含空格、数字、下划线或ASCII符号(如$)的文件名。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接