【问题标题】:File name look the same but is different after copying文件名看起来一样,但复制后不同
【发布时间】:2014-12-18 10:46:18
【问题描述】:

我的文件名看起来一样,但实际上并不相同。

我将 many_img/ 从 Debian1 复制到 OS X,然后从 OS X 复制到 Debian2(出于维护目的),在每个步骤中使用 rsync -a -e ssh 以保留所有内容。

如果我这样做 ls many_img/img1/* 我在 Debian1 和 Debian2 上得到视觉上相同的输出:

prévisionnel.jpg

但不知何故,ls many_img/img1/* | od -c 给出了不同的结果:

在 Debian1 上:

0000000   p   r 303 251   v   i   s   i   o   n   n   e   l  .   j   p
0000020   g  \n

在 Debian2 上:

0000000   p   r   e 314 201   v   i   s   i   o   n   n   e   l  .   j
0000020   p   g  \n

因此我在 Debian2 上的网络应用无法将文件系统中的图片与数据库中的文件名匹配。

我想也许我需要更改文件编码,但看起来它在每个操作系统上已经是 utf-8:

convmv --notest -f iso-8859-15 -t utf8 many_img/img1/* 

返回:

Skipping, already UTF-8

是否有命令从我的 Debian 2 取回我的 Debian 1 上的所有 4 万个文件名(无需再次传输)? 我很困惑是文件名编码问题还是其他问题?

【问题讨论】:

    标签: linux encoding terminal console filenames


    【解决方案1】:

    我终于找到了我一直在寻找的命令行转换工具(感谢 @Mark 让我走上正轨!)

    好吧,我不知道 OS X 在后台使用不同的 UTF-8 规范化编码文件名。

    • 看来 OS X 正在使用 Unicode Normalization Form D (NFD)
    • 当 Linux 操作系统使用 Unicode 规范化表格 C (NFC) 时

    HSF+ 文件系统将每个文件名字符编码为 UTF-16。 Unicode 字符在 OS X 上是分解的,而在 Linux 操作系统上是预先组合的。

    é 例如(带有尖音的拉丁文小写字母 e),在 Linux 上严格来说是一个 (U+00E9) 字符 并在 OS X 上以分解形式 (NFD) 分解为基本字母“e”(U+0065) 和重音符号(U+0301)

    关于转换工具:

    1. 从 Linux 操作系统执行的这个命令将从 NFD 转换文件名 到 NFC:

      convmv --notest --nfc -f utf8 -t utf8 /path/to/my/file

    2. 从 OS X 执行的这个命令将通过 ssh 与 NFD 同步到 NDC 即时转换:

      rsync -a --iconv=utf-8-mac,utf-8 -e ssh path/to/my/local/directory/* user@destinationip:/remote/path/

    我测试了这两种方法,效果很好。

    注意

    --iconv 选项仅适用于 rsync V3,而 OS X 默认提供旧的 2.6.9 版本,因此您需要先更新它。

    通常要检查和升级:

    rsync --version
    brew install rsync
    echo 'export PATH=/usr/local/bin:$PATH' >> ~/.profile
    

    【讨论】:

      【解决方案2】:

      第一个文件名包含单个字符é,而第二个文件名包含一个简单的e,后跟组合字符́ (COMBINING ACUTE ACCENT)。它们都是有效的 Unicode,它们只是 normalized 不同。看起来操作系统在创建文件时对文件名进行了规范化。

      【讨论】:

      • 感谢@Mark,竖起大拇指,你是 100% 正确的,它帮助我集中注意力并看得更远。经过几个小时的谷歌搜索,我终于找到了我需要相应地转换文件名的命令行工具。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      相关资源
      最近更新 更多