在我们经历了多个版本和托管平台的 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 语言环境,以避免不兼容/不一致。