在 SSH 中压缩文件(zip、tar、等...)时,是什么决定了压缩文件的 'sort order'?

When compressing files (zip, tar, ect...) in SSH what determines the 'sort order' in which files are compressed?

考虑对包含 2TB 递归文件夹和文件的文件夹执行以下命令 运行。

tar -cvzf _backup.tar.gz /home/wwwsite/public_html

考虑到正在压缩的文件夹充满了子文件夹(其中有数百个子文件夹和文件)和一个随机但顺序的命名约定,简短示例:

/17688EE/
/18503HH/
/19600SL/
/20659CS/

考虑到每个块之间有 10,000 多个文件夹(17000 个块,然后是 18000 个块,等等)。命名约定:数字 00000 + 字母 A-Z,(即:17000AZ-17000ZA),因此可以轻松地按名称对文件夹进行排序。

考虑 tar 命令正在 运行 屏幕中显示详细输出,以便检查该命令的 "progress"。

screen -S compress

理论上,我假设我可以简单地查看该屏幕的输出,但我注意到 TARBALL 似乎没有按任何顺序压缩文件夹它们是创建的,也不会根据文件夹的名称对它们进行排序

因此我的问题有两个:

除了查看 TARBALL 的详细输出和猜测;

  1. 有没有什么地方可以知道压缩过程需要多长时间才能完成? (例如在 TAR 上添加 -tack 命令以显示预计完成时间,类似于 SCP 命令的完成百分比)
  2. TAR 命令决定以什么顺序压缩文件夹? (有没有办法在压缩过程中告诉命令 "sort by" date/name?)

详细说明,在等待 17001AA-to-AZ 块压缩 20 分钟后,我认为接下来是 17001BA-to-BZ 块,但事实并非如此,详细输出显示了什么似乎是随机抓取文件夹而不按名称或日期排序)

简单的说:什么决定了压缩时的排序顺序?

如果您给 tar 一个目录名称列表,tar 文件中条目的顺序将与 readdir returns 文件名的顺序相匹配文件系统。您正在压缩 tar 文件这一事实与顺序无关。

这里有一个简单的例子来说明 Linux ext4 文件系统上发生的事情。其他文件系统的行为可能不同。

首先创建一个包含三个文件的新目录,a1a2a3

$ mkdir fred
$ cd fred
$ touch a1 a2 a3

现在让我们看看 readdir return 文件的顺序。 -U 选项将使 ls return 文件名按照它们在目录中的存储顺序未排序。

$ ls -U
a3  a1  a2

如您所见,在我的 Linux 设置中,文件 return 显然是随机排列的。

现在将文件粘贴到 tar 文件中。请注意,我为输入文件提供了 tar 目录名称(在本例中为“.”)以确保它必须在幕后调用 readdir

$ tar cf xxx.tar .

最后,让我们看看 tar 存储文件的顺序。

$ tar tf xxx.tar 
./
./a3
./a1
./a2

文件 a1a2a3 的顺序与 readdir return 从文件系统编辑文件名的顺序相匹配。 . 文件名存在是因为它明确包含在传递给 tar.

的命令行中

如果你想强制排序,你必须给 tar 一个排序的文件名列表。下面的示例显示了如何使用 -T - 命令行选项让 tar 从 stdin 读取文件名列表。

$ ls a* | tar  cvf yyy.tar -T -
a1
a2
a3

在这个玩具示例中,文件名列表将自动排序,因为 shell 对与通配符 a*.

匹配的文件名进行排序

确认一下,这就是 tar 文件中的内容。

$ tar tf yyy.tar 
a1
a2
a3

在您的用例中,通过管道将 findsort 命令组合到 tar 应该允许您创建一个包含尽可能多条目的排序 tar 文件随你心意。

像这样的东西作为一个点tar。

find | sort | tar -cvzf _backup.tar.gz -T -