在SSH中压缩文件(zip,tar,ect ...)时,决定了排序顺序'哪些文件被压缩?

时间:2018-01-02 13:15:26

标签: sorting tar

考虑在包含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命令以什么顺序决定压缩文件夹? (有没有办法告诉命令"按压"日期/名称压缩?)
  3. 详细说明,在等待17001AA到AZ块压缩20分钟后,我认为接下来将是17001BA到BZ块,但事实并非如此,详细输出显示了似乎随机抓取文件夹而不按名称或日期排序)

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

1 个答案:

答案 0 :(得分: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

在您的用例中,管道传递到find的{​​{1}}和sort命令的组合应该允许您创建一个包含任意数量的条目的排序tar文件。

以此为出发点。

tar