在SSH中压缩文件(zip,tar,ect ...)时,什么决定了压缩文件的“排序顺序”?

问题描述 投票:0回答:1

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

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

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

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

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

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

screen -S compress

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

因此我的问题有两个:

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

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

详细说明,在等待17001AA到AZ块压缩20分钟之后我会想到下一个将是17001BA到BZ块,但事实并非如此,详细输出显示了似乎随机抓取的内容没有按名称或日期排序的文件夹)

简单地说:什么决定了压缩过程中的排序顺序?

sorting tar
1个回答
1
投票

如果给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

在您的用例中,管道传输到findsorttar命令的组合应该允许您创建一个包含任意数量的条目的排序tar文件。

这样的事情是一个起点。

find | sort | tar -cvzf _backup.tar.gz -T -
© www.soinside.com 2019 - 2024. All rights reserved.