当目标位置剩余31GB的空间时,mv命令会出现"设备上没有剩余空间"的错误。

我一直在尝试将32.6 GB的文件移动到外部闪存驱动器上的一个文件夹中,以释放我的笔记本电脑SSD上的空间。在终端中打开源文件夹(并运行ulimit -S -s unlimited以防止mv出错),mv *from* /media/[username]/8849-14DB/Screenshots/成功地传输了前5.9 GB。

但是,还有26.7 GB要传输:

mv: cannot create regular file '/media/[username]/8849-14DB/Screenshots/Screenshot from 2022-01-06 06-34-27.png': No space left on device
mv: cannot create regular file '/media/[username]/8849-14DB/Screenshots/Screenshot from 2022-01-06 06-34-30.png': No space left on device
mv: cannot create regular file '/media/[username]/8849-14DB/Screenshots/Screenshot from 2022-01-06 06-34-34.png': No space left on device
mv: cannot create regular file '/media/[username]/8849-14DB/Screenshots/Screenshot from 2022-01-06 06-34-39.png': No space left on device
mv: cannot create regular file '/media/[username]/8849-14DB/Screenshots/Screenshot from 2022-01-06 06-35-23.png': No space left on device

[repeated ad infinitum]

尽管如此,事实上,所讨论的闪存驱动器并没有空间不足的问题,这可以通过以下方式证明:
- 我成功地将一个测试文件保存到该闪存驱动器中。 - 无论是驱动器的属性窗口还是磁盘条目都显示它仍然有31.1GB的可用空间。
然而,当我尝试使用图形用户界面将上述测试文件移动到我一直在尝试使用"mv"命令移动多个千兆字节文件的特定目录时,我确实遇到了"设备上没有剩余空间"的错误提示,这表明:
- 无论问题是什么,它都是特定于该文件夹的。 - 这不是一个特定于命令行的问题。
我查看了之前的问题:Filesystem - No space left error, but there is space。然而,那个问题的答案对我没有帮助,因为它们与ext系列文件系统上可用的inode数量有关,而在我的情况下,目标文件系统是FAT32格式的闪存驱动器。
我遇到了什么问题导致文件无法传输,该如何解决?
编辑:目标目录中有16,383个文件。

外部闪存驱动器有多大? - Esther
@Esther:总共有63.5 GB的存储空间,其中(正如我在问题中所说)还剩下31.1 GB的可用空间。 - Vikki
@Rinzwind:正如我在问题中所说的那样,该闪存驱动器没有使用ext文件系统进行格式化。 - Vikki
2@Rinzwind 这是fat32文件系统,所以没有inode。但可能会遇到在fat32下一个文件夹中同时存在多少个文件的文件系统限制,请参考https://superuser.com/questions/446282/max-files-per-directory-on-ntfs-vol-vs-fat32 - Esther
1有多少个文件?超过65,534个吗? - Esther
@Esther: 16,383. - Vikki
3但是文件名很长,所以它们实际上占据了足够的空间,可能会产生影响。我不知道确切的公式,但这很可能是最常见的原因。您可以使用NTFS来完全避免限制,或将文件放置在多个子目录中。 - Esther
这是一个新的闪存驱动器吗?如果是的话,你在哪里买的?有很多假冒的闪存驱动器(甚至冠以知名品牌的名义),声称容量很大,但实际上使用的存储芯片要小得多(内置控制器基本上会撒谎,说它有64GB,但实际上只有4GB),所以会出现这样的情况。即使是在亚马逊购买的东西也不例外,因为亚马逊允许市场销售商将他们的库存与亚马逊的混合(所以一个可疑的市场销售商向亚马逊提供廉价的劣质驱动器用于履行目的,亚马逊只是将其添加到产品池中)。 - Moo
@Moo:不是新的,而且这是沃尔格林(Walgreens)自有品牌(我发现它的存储能力可靠)。 - Vikki
有可能USB实际上并没有31GB的可用空间...很多廉价的中国存储设备声称拥有比实际更大的存储空间。其中一些甚至会在空间用尽之前向操作系统撒谎。 - GACy20
2@Vikki “Out of space” 不一定指的是物理空间问题。文件系统中的数据结构也有限制,对于 ext2/ext3/ext4 文件系统而言,常见的反应是“inode 用尽”。而对于 FAT32 文件系统来说,常见的反应则是“单个目录中的文件过多”。询问细节只是表明你在第一次表达时没有清楚地表述。 - Thorbjørn Ravn Andersen
3@GACy20 没有办法让驱动器向操作系统发出信号说“抱歉,你试图写入的空间实际上并不存在”,这就是为什么假闪存驱动器普遍会损坏数据而不仅仅是显示此错误的原因。 - user253751
1@user253751 当写入时,他们可能只会显示“设备上没有剩余空间”,但在查询统计信息时仍然报告空闲空间。 - GACy20
1@GACy20 真的假的?写入失败是另一个错误条件,即EIO /* I/O error */ - Incnis Mrsi
1@user253751 https://stackoverflow.com/questions/72421193/why-do-write-syscall-fails-with-enospc write和fsync调用可能会返回ENOSPC:设备上没有剩余空间,这取决于操作系统/驱动程序/文件系统的使用情况。 - GACy20
1@GACy20再次误解了重点。是的,文件系统可以(而且应该)在无法分配所需块时发出ENOSPC信号。但@user253751的观点是关于驱动器(即块设备)的。在/dev/sdn级别上不存在“(不)可用块”的概念。 - Incnis Mrsi
116,383是2^14-1。 - David Conrad
还有别忘了,FAT32文件系统的最大文件大小要比4 GiB小一点,这对于大型媒体文件来说是个问题。为了避免这些限制,但又保持跨平台可写性,我现在使用exFAT而不是FAT32。 - pts
2个回答

Ext4文件系统并不是唯一有文件数量限制的。FAT32文件系统在单个目录中存储文件的数量上有限制。如果你使用短名称(8个字符 + . + 3个字符的文件扩展名),那么限制是65,534个文件。然而,如果你使用较长的名称,那么每13个字节的名称将作为一个单独的目录项存储,这会大大限制你可以放入目录中的文件数量。

在你的情况下,看起来每个文件实际上占用了4个目录项,因为你有16,383个文件,而16,383 * 4等于65,532,这正好达到了限制。仔细观察,每个文件名有39个字符,即39个字节:恰好是13 * 3。所以每个文件名有3个目录项,还有一个用于实际文件内容的第四个目录项。

你可以通过以下方式解决这个问题:

1. 将驱动器格式化为NTFS,这将限制文件数量约为40亿个(应该足够了)。 2. 将文件放置在不同的子目录中,因为限制是在目录条目的数量上,而你还没有达到总文件数量的限制。

4好棒的抓住,Esther - Rinzwind
我在目标硬盘上创建了一个新的文件夹,并尝试将剩余的文件转移到其中,将它们分散到多个子目录中似乎确实起到了作用。(不打算重新格式化为NTFS,因为我想保持其与不兼容NTFS的系统(例如我的三台Power Macs)的可用性。)谢谢! - Vikki
目前,无论是NTFS还是exFAT,在Linux上都有相当好的内核支持。而且,exFAT规范已经公开,因此在所有平台上应该都能无问题地支持它。 - phuclv
1你能解释一下子目录的限制是如何建立的吗?我一直以为FAT的根目录是有限制的,但是子目录会根据需要动态扩展,但我从来没有关心过具体细节。 - U. Windl
2@U.Windl 显然它使用了一个16位索引来存储目录条目,因此它的目录条目数量限制在2^16个。 - Esther
3@U.Windl然后2个条目被用于"."和".."条目,这样每个目录就剩下了65,534个条目。 - Esther
@Esther 我在任何FAT描述中都找不到使用16位索引作为目录条目的参考资料,你有相关的参考资料吗? - U. Windl
2@U.Windl https://cscie92.dce.harvard.edu/spring2021/Microsoft可扩展固件倡议FAT32文件系统规范,版本1.03,20001206.pdf,第33-34页。 - Esther
2将这些文件分成单独的子目录是个好主意,因为在一个目录中拥有数万个文件会对性能产生巨大影响。 - Monty Harder
1数字分析不是我最喜欢的事情...但是你的数据看起来非常可靠和有信息量 +1 Esther :-) - Raffa
最终我找到了它(第3页及以下),而且我是正确的:FAT文件系统没有这个限制,但为了与旧的MS-DOS兼容性需要:“有许多FAT文件系统驱动程序和磁盘实用程序,包括微软的,希望能够使用16位WORD变量计算目录中的条目数。因此,目录不能有超过16位的条目数。然而,在FAT文件系统中没有16位计数器来计算目录条目。 - U. Windl
我不认为FAT32会为“.”和“..”保留目录项,是吗? - Mark Ransom

Ext4文件系统有限数量的索引节点(inodes)。如果您的文件系统包含大量(小型)文件,尽管还有很多磁盘空间(以“可用字节”计算)剩余,但它可能会因为没有剩余的空闲索引节点而被认为是“满”的。

您可以使用以下命令查看文件系统上可用的索引节点:

df -i <device/mountpoint>

2有两件事情表明这不是问题,一是它是一个特定于文件夹的问题,二是它不是一个扩展文件系统。(顺便说一下,几乎所有的Unix文件系统都有inode限制) - hildred
2是的,但在未来,人们可能在遇到inode问题时会偶然发现这个问题,所以我认为保留这个答案还是有用的。 - Heinrich supports Monica