如何在机械硬盘上打包大量小文件

虽然 SSD 的 4k 性能远高于机械硬盘,但是可能也能有所帮助

设想这样一个场景,有一个文件夹下面存了几百万个小文件,然后想把这个文件夹复制到另一台有 SSD 的机器上进行处理,但是很不幸的是,这堆小文件存在机械硬盘上。

使用 tar 打包是一个办法,但是 tar 在 Linux 上默认遍历磁盘内容的时候并不会按照 inode 的顺序,以此引发的寻道时间就足够喝一壶的了,因此需要一个方法让 tar 按照 inode 的顺序读取这些文件。很不幸的是,tar 并没有提供这个选项,我们只能迂回一下达到目的:

$ cd /path/to/small/files/folder
$ ls -U -i | sort -k1,1 -n | cut -d' ' -f2- > ~/filelist # folder content sorted with inode
$ tar -I "zstd -19 -T0" -cvf /path/to/another/disk/archive.tar.zst -T ~/filelist

tar -T 让 tar 从 filelist 中读取文件列表并打包,这时候 tar 就可以按照我们给的顺序(inode)来进行打包了,-I 这里使用 zstd 压缩。

这个情况并没有处理文件夹下有多层子目录,里面小文件更多的情况。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注