尝试将文件从 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)
有什么解决方法或解决方法吗?
如 Unix StackExchange 上所述,ext4 系统中的最大文件名是 255 字节。另请注意,UTF8 中的非 ASCII 字符至少需要 2 个字节。
在我看来,你已经超过了这个限制。
NTFS 中的文件名长度限制为255 个 UTF-16代码单元(CU)。
动态网自由门 天安門 天安门 法輪功 李洪志 Free Tibet 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命.gif
是UTF-16 中的 188-CU 字符串,但在 UTF-8 中以 280 个 CU编码,这显然超出了 ext4 中的限制(255 个 UTF-8 CU)UTF-8 将代码点 U+0800 到 U+FFFF 编码为 3 个字节,因此汉字和许多表情符号等高代码点将需要比 UTF-16 更多的字节来编码,并且生成的字符串会更长
如果您想坚持使用本机 Linux 文件系统,一种解决方案是使用限制为 4032 字节的ReiserFS,即4032 UTF-8 CU,如果您想保留名称。或者使用Reiser4,它是 ReiserFS 的继任者。它的限制只有 3976 字节,但仍然绰绰有余。否则,您别无选择,只能截断名称
对于非 Linux 文件系统,还有更多选项。所有 Windows 文件系统显然都可以工作,因为它们都以 UTF-16 工作。NTFS 和 exFAT 长期以来都在 Linux 中拥有出色的内核驱动程序,因此它们也是一个不错的选择。另一个可能的答案是HFS+,它也使用 UTF-16,但它是一个糟糕的 FS,所以远离它
请参阅Linux 在多大程度上支持超过 255 个字节的文件名?
您可以使用https://r12a.github.io/app-conversion/等工具来检查各种编码中的编码字节。上面的 UTF-16 字符串是
在 UTF-8 中是