如何按字母顺序创建tar文件?


22

我想创建一个tar文件,其中所有目录和文件均按字母顺序处理。这是针对整个目录层次结构的,因此首先要按字母顺序处理第一个目录,然后按字母顺序处理该目录中的子目录,依此类推。我浏览了手册页,却找不到相应的开关。

我承认,这是一半新颖,一半略微优化。我简直不敢相信没有简单的方法可以做到这一点。我肯定错过了什么。


2
为什么要这样做?
matthias krull 2010年

通常,这是因为我想知道tar操作即将完成的程度。当文件以随机顺序加载时,无法使用-v标志来分辨。
艾里克·罗伯逊

2
这不是完全正确的。如果将输出通过管道传输到文件并知道文件数(例如快速查找命令),则可以将-v输出(wc -l)与find中的文件数进行比较,以了解进度。
Slartibartfast

2
@matthiaskrull对此我没有相关的原因,我正在创建一个OVA文件(这是一个tar文件),用于在VMWare ESX Server上部署VM。OVA需要在其中的特定顺序文件(第一个文件应该是OVF,依此类推)。
xask

1
这也有一个很好的理由:当您只想提取一部分文件时,可以在非常大的文件上运行。由于默认情况下其顺序是随机的,并且您要提取文件/目录,因此,如果订购了文件/目录,则速度会更快;如果未订购,则需要先扫描整个存档,然后再知道其完成。
StormByte

Answers:


12

Slartibartfast处于正确的轨道上,但是tar的默认行为是进入目录,因此您可能会在生成的tar文件中获得同一文件的多个副本。您可以通过执行检查来 tar tf file.tar | sort 解决。解决方法是在tar中包括--no-recursion选项。同样,您应该能够通过使用 -print0 查找选项,然后使用--nulltar 选项发送奇怪的文件名。最终结果如下所示:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

您可以使用来检查tar文件中的顺序tar tsf tarfile.tar。尽管您可能永远不需要-print0,-z和--null选项,除非您知道遇到嵌入了换行符的文件名,但我从未尝试过。


非常感谢您使用--no-recursion选项。
艾里克(Erik)2012年

这是对我有用的解决方案。我有一个与Erick和Google带我到这里的用例不同的用例。我将随着时间的推移收集远程系统完整状态的快照。数据是高度冗余的。按时间对tar输入进行排序(文件名带有时间戳)可以提高压缩器的性能。快速测试显示改善了2倍(lzma2)。另外,我不会将归档文件解压缩到文件系统中,而是对tar条目进行流处理。排序后的流使调试输出更好,并且在流程链中还有其他好处。+1
约翰内斯

5

tar文件中文件的顺序并不重要,因为提取文件时,文件系统始终不会保留顺序。

对此没有任何开关,但是如果您确实需要,可以为tar提供按排序顺序排列的文件名列表,并且它将按照您给它的顺序创建tar文件。

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
或只是对输出进行排序:tar tf tarfile | sort
Doug Harris 2010年

我有太多文件(20,000+)无法在命令行上全部指定。
Erick Robertson 2010年

4
如果需要在下载时解压缩并显示,则tar文件中文件的顺序很重要。
艾瑞克(Erik)2012年

取决于文件系统。
托尔比约恩Ravn的安徒生

4

假设您没有任何名称中包含换行符的文件:

find /source_directory -print | sort | tar -czf target.tgz -T -

如果那行不通(从来没有尝试过,所以我不知道-表示-T参数的标准输入):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

然后是为什么的问题。但是有时候不问就容易。


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax是cpio和tar的POSIX继承者,并且融合了两者的最佳方面。默认情况下,它将写入tar存档(ustar)。它还会自动生成媒体并进行提示,并在完成后打印摘要。


0

作为@CharlieHerron答案的替代方法,如果您仅对保留内容(文件,符号链接)和文件夹元数据(例如,文件夹许可权,mtime等)感兴趣,则可能要从的find输出中过滤出文件夹。

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.