如何在 UTF-8 系统上查找(并重命名)包含无效字符 (Latin1) 的文件?

如何在 UTF-8 系统上查找(并重命名)包含无效字符 (Latin1) 的文件?

我从基于 Latin1 的系统中获得了一些旧文件,这些文件的名称在我的 UTF-8 系统上无效。它们显示为各种代码或问号。例如:

/tmp/test $ ls -1
'FRg_Pause lecture_'$'\371''.png'
'FRg_Pause lecture_'$'\353''.png'
'FRg_Pause lecture_'$'\350''.png'
'FRg_Pause lecture_'$'\374''.png'

/tmp/test $ find .
./FRg_Pause lecture_?.png
./FRg_Pause lecture_?.png
./FRg_Pause lecture_?.png
./FRg_Pause lecture_?.png

/tmp/test $ tar cvfz test.tar.gz *.png
FRg_Pause lecture_\351.png
FRg_Pause lecture_\352.png
FRg_Pause lecture_\340.png
FRg_Pause lecture_\374.png

我想重命名它们,最好是正确的 UTF-8 名称。例如:

FRg_Pause lecture_\340.png -> FRg_Pause lecture_à.png

但即使将它们重命名为,我不知道,“FRg_Pause Lecture_340.png”是否可以。只要新名称是有效的 UTF-8,我们的工具就会停止抱怨。

然而,一个复杂的问题是,有许多文件具有正确的 UTF-8 名称,因此我无法将操作系统切换到 Latin1 并完成它。我需要找到非 UTF-8 的文件(并且有很多,在许多目录中)并对它们执行一些操作。

有任何想法吗?首先,我发现很难找到这些文件。

答案1

感谢 Artem 和 MC68020 在评论中提出的建议。

不幸的是,detox这不起作用,因为它想要创建重复项(例如\340\342都映射到a)。

另一方面也convmv正确地完成了工作。

/tmp/test $ convmv -f latin1 -t utf-8 -r . --notest
mv "./FRg_Pause lecture_�.png"  "./FRg_Pause lecture_ù.png"
mv "./FRg_Pause lecture_�.png"  "./FRg_Pause lecture_ë.png"
mv "./FRg_Pause lecture_�.png"  "./FRg_Pause lecture_è.png"
mv "./FRg_Pause lecture_�.png"  "./FRg_Pause lecture_ü.png"
mv "./FRg_Pause lecture_�.png"  "./FRg_Pause lecture_à.png"
mv "./FRg_Pause lecture_�.png"  "./FRg_Pause lecture_ê.png"
mv "./FRg_Pause lecture_�.png"  "./FRg_Pause lecture_é.png"
Ready! I converted 7 files in 0 seconds.

现在开始修复 NAS 上的数千个文件:)

相关内容