考虑在包含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的详细输出并猜测外;
详细说明,在等待17001AA到AZ块压缩20分钟后,我认为接下来将是17001BA到BZ块,但事实并非如此,详细输出显示了似乎随机抓取文件夹而不按名称或日期排序)
简单地说:什么决定了压缩过程中的排序顺序?
答案 0 :(得分:1)
如果给tar提供目录名列表,则tar文件中条目的顺序将与readdir从文件系统返回文件名的顺序相匹配。您正在压缩tar文件的事实与订单无关。
这是一个快速示例,用于说明Linux ext4文件系统上发生的情况。其他文件系统可能表现不同。
首先使用三个文件a1
,a2
和a3
$ 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
文件a1
,a2
和a3
的顺序与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