在 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 的详细输出和猜测;
- 有没有什么地方可以知道压缩过程需要多长时间才能完成? (例如在 TAR 上添加 -tack 命令以显示预计完成时间,类似于 SCP 命令的完成百分比)
- TAR 命令决定以什么顺序压缩文件夹? (有没有办法在压缩过程中告诉命令 "sort by" date/name?)
详细说明,在等待 17001AA-to-AZ 块压缩 20 分钟后,我认为接下来是 17001BA-to-BZ 块,但事实并非如此,详细输出显示了什么似乎是随机抓取文件夹而不按名称或日期排序)
简单的说:什么决定了压缩时的排序顺序?
如果您给 tar 一个目录名称列表,tar 文件中条目的顺序将与 readdir returns 文件名的顺序相匹配文件系统。您正在压缩 tar 文件这一事实与顺序无关。
这里有一个简单的例子来说明 Linux ext4 文件系统上发生的事情。其他文件系统的行为可能不同。
首先创建一个包含三个文件的新目录,a1
、a2
和a3
$ 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
文件 a1
、a2
和 a3
的顺序与 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
在您的用例中,通过管道将 find
和 sort
命令组合到 tar
应该允许您创建一个包含尽可能多条目的排序 tar 文件随你心意。
像这样的东西作为一个点tar。
find | sort | tar -cvzf _backup.tar.gz -T -
考虑对包含 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 的详细输出和猜测;
- 有没有什么地方可以知道压缩过程需要多长时间才能完成? (例如在 TAR 上添加 -tack 命令以显示预计完成时间,类似于 SCP 命令的完成百分比)
- TAR 命令决定以什么顺序压缩文件夹? (有没有办法在压缩过程中告诉命令 "sort by" date/name?)
详细说明,在等待 17001AA-to-AZ 块压缩 20 分钟后,我认为接下来是 17001BA-to-BZ 块,但事实并非如此,详细输出显示了什么似乎是随机抓取文件夹而不按名称或日期排序)
简单的说:什么决定了压缩时的排序顺序?
如果您给 tar 一个目录名称列表,tar 文件中条目的顺序将与 readdir returns 文件名的顺序相匹配文件系统。您正在压缩 tar 文件这一事实与顺序无关。
这里有一个简单的例子来说明 Linux ext4 文件系统上发生的事情。其他文件系统的行为可能不同。
首先创建一个包含三个文件的新目录,a1
、a2
和a3
$ 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
文件 a1
、a2
和 a3
的顺序与 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
在您的用例中,通过管道将 find
和 sort
命令组合到 tar
应该允许您创建一个包含尽可能多条目的排序 tar 文件随你心意。
像这样的东西作为一个点tar。
find | sort | tar -cvzf _backup.tar.gz -T -