文件名看起来相同但复制后不同

时间:2014-10-22 20:39:57

标签: linux encoding terminal console filenames

我的文件名看起来一样,但它们不是。

我将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上的所有40,000个文件名(没有全部转移)? 如果它是文件名编码问题或其他什么我感到困惑?

2 个答案:

答案 0 :(得分:5)

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

好的,我不知道OS X是使用不同的UTF-8标准化编码文件名。

  • OS X正在使用Unicode规范化表格D(NFD)
  • 而Linux OS使用Unicode规范化表格C(NFC)

HSF +文件系统对UTF-16中的每个文件名字符进行编码。 在OS X上分解Unicode字符与在Linux OS上预分解。

例如

é(具有急性重音的拉丁文小写字母e)在技术上是Linux上的(U+00E9)字符 并被分解成一个基本字母" e" OS X上的(U+0065)和分解形式(NFD)的急性重音(U+0301)

现在关于转换工具:

  1. 从Linux OS执行的此命令将从NFD转换文件名 到NFC:

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

  2. 从OS X执行的此命令将通过ssh rsync与NFD到NDC 即时转换:

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

  3. 我测试了这两种方法,它就像一个魅力。

    注意

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

    通常要检查和升级:

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

答案 1 :(得分:2)

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