gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:08:05 36 4
gpt4 key购买 nike

考虑在一个包含 2TB 递归文件夹和文件的文件夹上运行以下命令。

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

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

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

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

考虑到 tar 命令正在屏幕上运行,输出详细,以便检查该命令的“进度”。

screen -S compress

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

因此我的问题有两个方面:

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

  1. 有没有什么地方可以查明完成压缩过程需要多长时间? (例如在 TAR 上添加 -tack 命令以显示预计完成时间,类似于 SCP 命令的完成百分比)
  2. TAR 命令决定以什么顺序压缩文件夹? (有没有办法告诉命令在压缩过程中按日期/名称“排序”?)

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

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

最佳答案

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

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

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

$ mkdir fred
$ cd fred
$ touch a1 a2 a3

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

$ ls -U
a3 a1 a2

如您所见,在我的 Linux 设置中,文件以明显随机的顺序返回。

现在将文件粘贴到一个 tar 文件中。注意我给 tar 输入文件的目录名(在本例中为“.”)以确保它必须调用 readdir在幕后。

$ tar cf xxx.tar .

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

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

文件a1a2a3 的顺序与readdir 的顺序相匹配从文件系统返回文件名。 . 文件名存在是因为它明确包含在传递给 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 文件尽可能多的条目。

像这样的东西作为起点。

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

关于sorting - 在 SSH 中压缩文件(zip、tar 等)时,什么决定了压缩文件的 'sort order'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48061720/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com