我有一个文件,想通过外部硬盘从计算机 A 传输到计算机 B。所有这些硬盘都采用 ext4 格式。该文件在计算机 A 和外部硬盘上均可访问(意味着我可以毫无问题地读取它)。
当我想将保存在外部硬盘上的文件 rsync 到计算机 B 时:
rsync: [receiver] mkstemp "/home/theuser/Documents/path/to/the/file_with_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_long_filename.pdf.LY2KGE" failed: File name too long (36)
我在以下问题和网站中看到,这可能与 ext4 文件系统的最大文件名长度为 255 字节有关
- rsync 对于包含 UTF-8 字符的文件名,出现“文件名太长(36)”错误
- https://winbuzzer.com/2021/06/30/filesystems-explained-whats-the-difference- Between-fat32-ntfs-exfat-hfs-and-ext4-xcxwbt/
我的问题是:如果该文件可以在计算机 A 和外部硬盘上访问,这意味着文件名没有问题,那么为什么在尝试传输文件时会出现问题?
这里的关键词是
mkstemp
您可以在错误消息中看到的。(来源)
该消息还包含字符串
file_with_very_…_very_long_filename.pdf.LY2KGE
。我认为发生了以下情况:file_with_very_…_very_long_filename.pdf
。不算太长,但也接近极限。rsync
使用原名创建了 的模板mkstemp()
。该模板为file_with_very_…_very_long_filename.pdf.XXXXXX
。mkstemp()
尝试创建名为 的文件file_with_very_…_very_long_filename.pdf.LY2KGE
。这个名称明显比原始名称长。正是这个名称太长导致了失败。显然,如果一切顺利,
rsync
最终会将文件重命名为原来的名称。我不太了解
rsync
底层工作原理,在本段中我将进行有根据的猜测。很可能rsync
在传输过程中使用临时名称以原子方式创建(或替换)每个目标文件。这是一种已知的良好做法。想象一下somefile
即将创建(或覆盖)并且最终大小并不小。如果直接rsync
写入somefile
,则文件会有一个不完整(或不连贯)的时间窗口。以临时名称(例如somefile.U3RJV7
或只是U3RJV7
)准备一个新的完整文件,然后将其移动到同一文件系统内的目标名称可以解决这个问题:没有任何内容(或旧版本),突然出现一个完整的(或完全更新的)文件作为somefile
。如果接收方
rsync
使用一个相当短的固定长度模板,那么就不会有问题。它使用的模板比目标名称长,因此出现问题。这可能被视为一个错误。我浏览了一下
man 1 rsync
,没有找到调整错误行为的选项。目前,我认为如果你想要rsync
传输文件,你需要使用更短的文件名。传输后应该可以重新命名文件(在两端)。