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

Yor*_*ric 2 linux terminal console filenames encoding

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

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

如果我 ls many_img/img1/*在Debian1和Debian2上获得相同的输出:

prévisionnel.jpg
Run Code Online (Sandbox Code Playgroud)

但不知何故,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
Run Code Online (Sandbox Code Playgroud)

在Debian2上:

0000000   p   r   e 314 201   v   i   s   i   o   n   n   e   l  .   j
0000020   p   g  \n
Run Code Online (Sandbox Code Playgroud)

因此,我在Debian2上的Web应用程序无法将文件系统中的图片与数据库中的文件名相匹配.

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

convmv --notest -f iso-8859-15 -t utf8 many_img/img1/* 
Run Code Online (Sandbox Code Playgroud)

返回:

Skipping, already UTF-8
Run Code Online (Sandbox Code Playgroud)

是否有命令从我的Debian 2中取回我的Debian 1上的所有40,000个文件名(没有再次转移)?如果它是文件名编码问题或其他什么我很困惑?

Yor*_*ric 6

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

好吧,我不知道OS X是用不同的UTF-8规范化编码文件名.

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

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

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

现在关于转换工具:

  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 /

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

注意:

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

通常要检查和升级:

rsync --version
brew install rsync
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.profile
Run Code Online (Sandbox Code Playgroud)