我在linux上安装的NTFS分区上有一堆音乐文件,文件名带有unicode字符。我在编写脚本以重命名文件时遇到问题,因此所有文件名都只使用ASCII字符。我认为使用iconv
命令应该有效,但是我无法转义'mv'
命令的字符。
编辑:如果unicode字符没有直接转换,则无关紧要。我想我只会用“?”代替那些。字符。
答案 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字节字符。