使用 Windows 在 NTFS 上复制|移动稀疏文件

使用 Windows 在 NTFS 上复制|移动稀疏文件

如何使用 Windows 附带的本机工具将稀疏文件从一个 NTFS 卷复制或移动到另一个 NTFS 卷,同时保持稀疏性?如果无法使用本机工具执行此操作,那么来自受信任供应商的免费应用程序可以执行此操作吗?肯定有一个命令提示符命令或 powershell 命令可以执行此操作。

我有一个 250GiB 的文件,占用了 20GiB 的磁盘空间,我希望它在移动时继续只占用 20GiB。谢谢。

答案1

您无法使用标准 Windows 工具来完成此操作。

但有一个实用功能。转到http://www.flexhex.com/docs/articles/sparse-files.phtml,下载并解压 sparse.zip。

然后从命令行运行:

cs.exe c:\src.dat d:\dest.dat

文件将被复制并保持稀疏性。

答案2

使用赛格威并使用选项挂载文件系统sparse。然后,支持稀疏文件的 Unix 命令(例如cpdd conv=sparsersync -S)将正确地创建或复制文件作为稀疏文件。正如人们所预料的那样,简单的输出重定向不会创建稀疏文件。

请看下面的演示。

$ mount -o sparse D: /tmp/mnt
mount: warning - /tmp/mnt does not exist.
$ cd /tmp/mnt
$ dd conv=sparse if=/dev/zero seek=10000 of=sparse count=1
1+0 records in
1+0 records out
512 bytes copied, 0.0101909 s, 50.2 kB/s
$ ls -lh sparse
-rw-rw-r--+ 1 dds None 4.9M Sep  5 13:05 sparse
$ du -h sparse
0       sparse
$ cp sparse sparse-cp
$ dd conv=sparse if=sparse of=sparse-dd
10001+0 records in
10001+0 records out
5120512 bytes (5.1 MB, 4.9 MiB) copied, 0.0500354 s, 102 MB/s
$ rsync -S sparse sparse-rsync
$ cat sparse >sparse-fail-cat
$ cat sparse | dd conv=sparse of=sparse-cat-dd
$ ls -lh sparse*
-rw-rw-r--+ 1 dds None 4.9M Sep  5 13:05 sparse
-rw-rw-r--+ 1 dds None 4.9M Sep  5 13:15 sparse-cat-dd
-rw-rw-r--+ 1 dds None 4.9M Sep  5 13:06 sparse-cp
-rw-rw-r--+ 1 dds None 4.9M Sep  5 13:11 sparse-dd
-rw-rw-r--+ 1 dds None 4.9M Sep  5 13:19 sparse-fail-cat
----rw----+ 1 dds None 4.9M Sep  5 13:06 sparse-rsync
$ du -h sparse*
0       sparse
0       sparse-cat-dd
0       sparse-cp
0       sparse-dd
4.9M    sparse-fail-cat
0       sparse-rsync

答案3

在 Windows 上我最终使用了六、WinHex可以做到这一点,或者更确切地说,是它的取证兄弟 X-Ways Forensics。GUI 在菜单中有一个选项可以稀疏地复制文件。

答案4

我写了一个小脚copy-sparse-windows.sh本来复制文件,使其尽可能稀疏。这需要msys2或类似的,具体来说shtruncatersync

它使用 Windowsfsutil工具设置稀疏标志,truncate创建一个大的空文件,并rsync复制非零内容。

据我了解,其他一些答案不会创建新的稀疏区域。我想通过尽可能地添加稀疏区域来减小大型 VM 磁盘映像的大小。

#!/bin/sh -euv
from=$1 to=$2
touch "$to"
fsutil sparse setflag "$to"
truncate --reference "$from" "$to"
rsync --archive --inplace --no-whole-file --verbose --progress "$from" "$to"

相关内容