我想知道我是否有一个表观大小为 1 GiB 但实际大小为 0 B 的文件是否可以复制到例如具有 512 kiB 可用空间的 USB 闪存盘?
您可以使用以下命令创建一个文件:
dd if=/dev/null of=big-file bs=1 seek=1GiB
现在您可以看到外观尺寸和实际尺寸:
du --apparent-size -hs big-file
笔记:删除--apparent-size
获取实际尺寸的选项。
因此,主要问题是:将文件复制到某个目录(硬盘驱动器、USB 闪存盘、DVD 等)时会考虑哪种大小?
答案1
实际尺寸。
目标文件的。
这最简单的实现就是不要试图提前预测这一点。
除此之外,还需要一小部分作为开销。这种开销的预测会更加复杂。
对稀疏文件的支持有所不同,具体取决于文件系统和进行复制的程序。最值得注意的是,FAT 文件系统不支持稀疏文件。
GNUcp
自动检测并处理稀疏文件。它不会提前检查空间。 (基于 GNU coreutils 8.29 的文档)
默认情况下,通过粗略启发式检测稀疏源文件,并且相应的目标文件也变得稀疏。这就是 所选择的行为
--sparse=auto
。指定--sparse=always
只要 SOURCE 文件包含足够长的零字节序列就创建稀疏 DEST 文件。
请注意,文件系统可以具有不同的块大小。这可能会导致稀疏文件使用的空间量增加,甚至减少!
(一般写入文件数据还需要占用自己空间的内部文件系统结构。这不会显示在文件的大小中 - 既不是实际大小,也不是外观大小。在传统的 UNIX 文件系统设计中,您还需要一个空闲的索引节点。可用于 inode 的空间如下所示df -i
。最明显的是,您需要一些空间来存储文件名:-);这通常显示在父目录的大小中。这在问题中具体讨论创建大量空文件是否会耗尽磁盘空间?)