Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 文件名看起来相同,但复制后不同_Linux_Encoding_Terminal_Console_Filenames - Fatal编程技术网

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

Linux 文件名看起来相同,但复制后不同,linux,encoding,terminal,console,filenames,Linux,Encoding,Terminal,Console,Filenames,我的文件名看起来一样,但实际上不同 我将many\u img/从Debian1复制到OS X,然后从OS X复制到Debian2(出于维护目的),并在每个步骤上使用rsync-a-e ssh,以保留所有内容 如果我做了ls many\u img/img1/*我在Debian1和Debian2上获得了相同的视觉输出: prévisionnel.jpg 但不知何故,ls many_img/img1/*| od-c给出了不同的结果: 关于Debian1: 0000000 p r 303 25

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

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

如果我做了
ls many\u 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上的web应用程序无法将文件系统中的图片与数据库中的文件名匹配

我想可能需要更改文件编码,但看起来每个操作系统上都已经有utf-8了:

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

Skipping, already UTF-8
是否有一个命令可以从我的Debian 2中取回我所有的4万个文件名,比如我的Debian 1上的文件名(不需要再次传输)?
我不知道这是文件名编码问题还是其他问题?

第一个文件名包含单个字符,而第二个文件名包含一个简单的
e
,后跟组合字符。它们都是有效的Unicode,只是不同而已。操作系统似乎在创建文件时规范化了文件名。

我终于找到了我要找的命令行转换工具(感谢@Mark将我设置在正确的轨道上!)

好吧,我不知道OSX是用不同的UTF-8标准化在后台对文件名进行编码的

  • OSX似乎正在使用Unicode规范化表单D(NFD)
  • Linux操作系统使用Unicode规范化表单C(NFC)
HSF+文件系统对UTF-16中的每个文件名字符进行编码。 Unicode字符在OSX上分解,而在Linux操作系统上预合成

例如,
é
(拉丁文小写字母e带有尖锐的重音),在Linux上从技术上讲是一个
(U+00E9)
字符 并且在OSX上被分解为基本字母“e”(U+0065)和分解形式(NFD)的锐重音
(U+0301)

现在介绍转换工具:
  • 从Linux操作系统执行的此命令将从NFD转换文件名 NFC:

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

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

    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
    

    谢谢@Mark,竖起大拇指,你说得100%对,这帮助我集中精力,看得更远。在谷歌搜索了几个小时后,我终于找到了相应转换文件名所需的命令行工具。