我想创建一个tar文件,其中所有目录和文件均按字母顺序处理。这是针对整个目录层次结构的,因此首先要按字母顺序处理第一个目录,然后按字母顺序处理该目录中的子目录,依此类推。我浏览了手册页,却找不到相应的开关。
我承认,这是一半新颖,一半略微优化。我简直不敢相信没有简单的方法可以做到这一点。我肯定错过了什么。
我想创建一个tar文件,其中所有目录和文件均按字母顺序处理。这是针对整个目录层次结构的,因此首先要按字母顺序处理第一个目录,然后按字母顺序处理该目录中的子目录,依此类推。我浏览了手册页,却找不到相应的开关。
我承认,这是一半新颖,一半略微优化。我简直不敢相信没有简单的方法可以做到这一点。我肯定错过了什么。
Answers:
Slartibartfast处于正确的轨道上,但是tar的默认行为是进入目录,因此您可能会在生成的tar文件中获得同一文件的多个副本。您可以通过执行检查来
tar tf file.tar | sort
解决。解决方法是在tar中包括--no-recursion选项。同样,您应该能够通过使用 -print0
查找选项,然后使用--null
tar 选项发送奇怪的文件名。最终结果如下所示:
find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -
您可以使用来检查tar文件中的顺序tar tsf tarfile.tar
。尽管您可能永远不需要-print0,-z和--null选项,除非您知道遇到嵌入了换行符的文件名,但我从未尝试过。
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
tar tf tarfile | sort
假设您没有任何名称中包含换行符的文件:
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
然后是为什么的问题。但是有时候不问就容易。
find . -depth -print0 | sort -z | pax -wvd0 > file.tar
Pax是cpio和tar的POSIX继承者,并且融合了两者的最佳方面。默认情况下,它将写入tar存档(ustar)。它还会自动生成媒体并进行提示,并在完成后打印摘要。