我有一堆目录和子目录,其中包含带有特殊字符的文件,例如以下文件:
robbie@phil:~$ ls test�sktest.txt
test?sktest.txt
查找揭示了一个转义序列:
robbie@phil:~$ find test�sktest.txt -ls
424512 4000 -rwxr--r-x 1 robbie robbie 4091743 Jan 26 00:34 test\323sktest.txt
我什至可以在控制台上键入其名称的唯一原因是由于制表符的完成。这也意味着我可以手动重命名它们(并去除特殊字符)。
我已将LC_ALL设置为UTF-8,这似乎无济于事(也不在新的shell上):
robbie@phil:~$ echo $LC_ALL
en_US.UTF-8
我正在使用Mac上的ssh连接到计算机。这是Ubuntu安装:
robbie@phil:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=7.10
DISTRIB_CODENAME=gutsy
DISTRIB_DESCRIPTION="Ubuntu 7.10"
Shell是Bash,TERM设置为xterm-color。
这些文件已经存在了很长一段时间,并且尚未使用该Ubuntu版本创建。因此,我不知道以前的系统编码设置是什么。
我已经尝试过以下方法:
find . -type f -ls | sed 's/[^a-zA-Z0-9]//g'
但是我找不到能满足我所有需求的解决方案:
- 识别所有具有不可显示字符的文件(以上内容忽略太多)
- 对于目录树中的所有那些文件(递归),请执行mv oldname newname
- (可选)将ä等特殊字符音译为a的能力(不是必需的,但会很棒)
要么
- 正确显示所有这些文件(尝试打开它们时在应用程序中没有错误)
我有些零碎的事情,例如遍历所有文件并移动它们,但是识别文件并为mv命令正确格式化它们似乎是困难的部分。
也欢迎提供任何其他有关它们为什么无法正确显示或如何“猜测”正确编码的信息。(我已经尝试过convmv,但是它似乎并没有完全满足我的要求:http : //j3e.de/linux/convmv/)