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

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

我想创建一个 tar 文件,其中所有目录和文件都按字母顺序处理。这是针对要打包的整个目录层次结构的,因此它将首先按字母顺序处理第一个目录,然后按字母顺序处理其中的子目录,依此类推。我查看了手册页,找不到用于此的开关。

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

答案1

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

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

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

答案2

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

答案3

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

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

如果这不起作用(从未尝试过,所以我不知道 -T 参数的 - 表示 stdin):

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

接下来是“为什么”的问题。但有时不问会更容易。

答案4

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

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -

相关内容