尝试将文件从 NTFS 格式的 HDD 复制到 EXT4 格式的 HDD,rsync
无法复制其中一些由亚洲(UTF-8)字符组成的相对较长的文件名。
例如,有一个名为的文件:
动态网自由门 天安門 天安门 法輪功 李洪志 Free Tibet 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命.gif
它位于一个不太短的目录路径内,并且rsync
,即使和-s
也--iconv=utf8
无法复制它们,例如:
sending incremental file list
rsync: [generator] recv_generator: failed to stat "/path/to/file/\#345\#212\#250\#346\#200\#201\#347\#275\#221\#350\#207\#252\#347\#224\#261\#351\#227\#250 \#345\#244\#251\#345\#256\#211\#351\#226\#200 \#345\#244\#251\#345\#256\#211\#351\#227\#250 \#346\#263\#225\#350\#274\#252\#345\#212\#237 \#346\#235\#216\#346\#264\#252\#345\#277\#227 Free Tibet \#345\#205\#255\#345\#233\#233\#345\#244\#251\#345\#256\#211\#351\#226\#200\#344\#272\#213\#344\#273\#266 The Tiananmen Square protests of 1989 \#345\#244\#251\#345\#256\#211\#351\#226\#200\#345\#244\#247\#345\#261\#240\#346\#256\#272 The Tiananmen Square Massacre \#345\#217\#215\#345\#217\#263\#346\#264\#276\#351\#254\#245\#347\#210\#255 The Anti-Rightist Struggle \#345\#244\#247\#350\#272\#215\#351\#200\#262\#346\#224\#277\#347\#255\#226 The Great Leap Forward \#346\#226\#207\#345\#214\#226\#345\#244\#247\#351\#235\#251\#345\#221\#275.gif": File name too long (36)
有没有什么修复或者解决方法?
答案1
NTFS 中的文件名长度限制为255 UTF-16代码单元(聯絡電子計算機)。动态网自由门 天安門 天安门 法輪功 李洪志 Free Tibet 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命.gif
是一个188-CU 字符串(UTF-16 格式),但编码为280 个 CU(采用 UTF-8)显然超出了 ext4 的限制(255 个 UTF-8 CU)
UTF-8 使用 3 个字节对代码点 U+0800 至 U+FFFF 进行编码,因此中文字符和许多表情符号等高代码点需要比 UTF-16 更多的字节进行编码,并且生成的字符串会更长
如果你想坚持使用原生 Linux 文件系统,一个解决方案是使用雷泽文件系统其限制为 4032 字节,即4032 个 UTF-8 CU,如果你想保留名称。或者使用赖泽4这是 ReiserFS 的后继者。它的限制只有 3976 字节,但仍然绰绰有余。否则,您别无选择,只能截断名称
对于非 Linux 文件系统,还有更多选择。所有 Windows 文件系统显然都可以工作,因为它们都以 UTF-16 编码工作。NTFS 和 exFAT 在 Linux 中长期以来都有出色的内核驱动程序,因此它们也是不错的选择。另一个可能的答案是高频振动+它也使用 UTF-16,但它的 FS 很糟糕,所以最好远离它
看Linux 对长度超过 255 字节的文件名的支持程度如何?
您可以使用以下工具https://r12a.github.io/app-conversion/检查各种编码中的编码字节。上面的字符串在 UTF-16 中是
52A8 6001 7F51 81EA 7531 95E8 0020 5929 5B89 9580 0020 5929 5B89 95E8 0020 6CD5
8F2A 529F 0020 674E 6D2A 5FD7 0020 0046 0072 0065 0065 0020 0054 0069 0062 0065
0074 0020 516D 56DB 5929 5B89 9580 4E8B 4EF6 0020 0054 0068 0065 0020 0054 0069
0061 006E 0061 006E 006D 0065 006E 0020 0053 0071 0075 0061 0072 0065 0020 0070
0072 006F 0074 0065 0073 0074 0073 0020 006F 0066 0020 0031 0039 0038 0039 0020
5929 5B89 9580 5927 5C60 6BBA 0020 0054 0068 0065 0020 0054 0069 0061 006E 0061
006E 006D 0065 006E 0020 0053 0071 0075 0061 0072 0065 0020 004D 0061 0073 0073
0061 0063 0072 0065 0020 53CD 53F3 6D3E 9B25 722D 0020 0054 0068 0065 0020 0041
006E 0074 0069 002D 0052 0069 0067 0068 0074 0069 0073 0074 0020 0053 0074 0072
0075 0067 0067 006C 0065 0020 5927 8E8D 9032 653F 7B56 0020 0054 0068 0065 0020
0047 0072 0065 0061 0074 0020 004C 0065 0061 0070 0020 0046 006F 0072 0077 0061
0072 0064 0020 6587 5316 5927 9769 547D 002E 0067 0069 0066
在 UTF-8 中
E5 8A A8 E6 80 81 E7 BD 91 E8 87 AA E7 94 B1 E9 97 A8 20 E5 A4 A9 E5 AE 89 E9
96 80 20 E5 A4 A9 E5 AE 89 E9 97 A8 20 E6 B3 95 E8 BC AA E5 8A 9F 20 E6 9D 8E
E6 B4 AA E5 BF 97 20 46 72 65 65 20 54 69 62 65 74 20 E5 85 AD E5 9B 9B E5 A4
A9 E5 AE 89 E9 96 80 E4 BA 8B E4 BB B6 20 54 68 65 20 54 69 61 6E 61 6E 6D 65
6E 20 53 71 75 61 72 65 20 70 72 6F 74 65 73 74 73 20 6F 66 20 31 39 38 39 20
E5 A4 A9 E5 AE 89 E9 96 80 E5 A4 A7 E5 B1 A0 E6 AE BA 20 54 68 65 20 54 69 61
6E 61 6E 6D 65 6E 20 53 71 75 61 72 65 20 4D 61 73 73 61 63 72 65 20 E5 8F 8D
E5 8F B3 E6 B4 BE E9 AC A5 E7 88 AD 20 54 68 65 20 41 6E 74 69 2D 52 69 67 68
74 69 73 74 20 53 74 72 75 67 67 6C 65 20 E5 A4 A7 E8 BA 8D E9 80 B2 E6 94 BF
E7 AD 96 20 54 68 65 20 47 72 65 61 74 20 4C 65 61 70 20 46 6F 72 77 61 72 64
20 E6 96 87 E5 8C 96 E5 A4 A7 E9 9D A9 E5 91 BD 2E 67 69 66
答案2
如上所述 在 Unix StackExchange 上,ext4 系统中的最大文件名为 255 字节。另请注意,UTF8 中的非 ASCII 字符至少占用 2 个字节。
在我看来你已经超出了这个限制。