如何在 Unix 上操作带重音符号的文件?

如何在 Unix 上操作带重音符号的文件?

在我们经历了多个版本和托管平台的 CMS 上,我们刚刚遇到了一个无法从其 URL 工作的带重音图像文件。所以我通过 ssh 连接到该框并尝试重命名它。

但是,我不知道如何正确输入它的名称。例如,我知道如果一个文件被调用,my file.txt你会做类似的事情mv my\ file.txt my_new_file.txt,但你如何移动一个名为的文件café.txt

最后,我使用了通配符,mv caf*.txt cafe.txt但我仍然想知道为什么这个重音图像一开始就不起作用,以及在 unix 上处理它的正确方法是什么。

答案1

使用 bash:

只是为了看看我的文件:

$ ls
café.txt

检查文件名的十六进制字节(注意:我的可能不同...我的可能是 UTF-8 编码的):

$ echo * | hexdump -C
00000000  63 61 66 c3 a9 2e 74 78  74 0a                    |caf...txt.|
0000000a

然后使用键盘上找不到的部分的十六进制代码来制作文件名:

$ ls $'caf\xc3\xa9.txt'
café.txt

在 bash 中,$' ... ' 将扩展转义符(与“echo -e”非常相似)。而 \x 后跟 2 位十六进制代码将用该字符替换它。

我不觉得下面这个有什么问题:

ls caf*.txt

随后是

mv caf*.txt cafe.txt

但如果由于某种原因需要匹配多个文件,则可以使用十六进制内容:

ls $'caf\xc3\xa9.txt'
mv $'caf\xc3\xa9.txt' café.txt

答案2

Unix 文件系统将文件名存储为原始字节序列。内核不知道也不关心文件名到底是什么。

访问它们的应用程序应使用正确的编码来正确显示非 ASCII 字符。通常的方式是通过 LC_ALL/LC_* 或 LANG 环境变量。我建议在访问文件系统的所有应用程序上使用 UTF-8 语言环境,以避免不兼容/不一致。

相关内容