如何将文件名从unicode转换为ascii

时间:2010-06-10 04:08:59

标签: bash unicode scripting ascii

我在linux上安装的NTFS分区上有一堆音乐文件,文件名带有unicode字符。我在编写脚本以重命名文件时遇到问题,因此所有文件名都只使用ASCII字符。我认为使用iconv命令应该有效,但是我无法转义'mv'命令的字符。

编辑:如果unicode字符没有直接转换,则无关紧要。我想我只会用“?”代替那些。字符。

3 个答案:

答案 0 :(得分:3)

有时mv将无法读取shell中的文件名,因此您可以尝试inode引用。

获取文件的inode:

$ ls -il

输出将是这样的:

13377799 -rw-r--r--  1 draco  draco      11809 Apr 25 01:39 some_filename.ext
9340462  -rw-r--r--  1 draco  draco      81648 Apr 23 02:27 some_strange_filename.ext
9340480  -rw-r--r--  1 draco  draco       4717 Apr 23 03:54 yikes__oh_look_a_file_火

然后使用find获取您的文件,也许使用Thanatos的python代码:

$ find . -inum 9340480 -exec ./unistrip.py {} \;

你也可以在shell中使用上面的iconv命令。

希望这可以帮助别人,并原谅我的任何错误[第一个回答]。

答案 1 :(得分:2)

我认为iconv没有任何角色替换设施。这在Python中可能有所帮助:

#!/usr/bin/python
import sys

def unistrip(s):
    if isinstance(s, str):
        s = s.decode('utf-8')
    chars = []
    for i in s:
        if ord(i) > 0x7f:
            chars.append(u'?')
        else:
            chars.append(i)
    return u''.join(chars)

if __name__ == '__main__':
    print unistrip(sys.argv[1])

然后打电话给:

$ ./unistrip.py "yikes__oh_look_a_file_火"
yikes_?_oh_look_a_file_?

此外:

$ mv "yikes__oh_look_a_file_火" "`./unistrip.py "yikes__oh_look_a_file_火"`"

您可以先测试一下。 对于大型移动操作,建议生成mv命令列表(即编写脚本的代码),因为您可以在告诉它们执行之前查看移动命令。

答案 2 :(得分:2)

convmv是一个很好的Perl脚本来转换文件名编码。但它无法处理不在目标编码中的字符。

您可以将不是ASCII的任何字符更改为“?”使用与Perl一起分发的重命名实用程序:

rename 's/[^ -~]/?/g' *

不幸的是,这会用多个'?'替换多字节字符。根据所使用的Unicode编码以及更改正则表达式所涉及的字符可能会有所帮助,例如

rename 's/[^ -~]{2}/?/g' *

表示2字节字符。