我想创建一个 tar 文件,其中所有目录和文件都按字母顺序处理。这是针对要打包的整个目录层次结构的,因此它将首先按字母顺序处理第一个目录,然后按字母顺序处理其中的子目录,依此类推。我查看了手册页,找不到用于此的开关。
我承认,这一半是新奇,一半是轻微的优化。我只是不敢相信没有简单的方法可以做到这一点。我一定是错过了什么。
答案1
Slartibartfast 走在正确的轨道上,但 tar 的默认行为是进入目录,因此您可能会在生成的 tar 文件中得到同一文件的多个副本。您可以通过执行以下操作来检查:
tar tf file.tar | sort
解决方法是将 --no-recursion 选项包含在 tar 中。此外,您应该能够通过使用-print0
find 选项,然后使用--null
tar 选项来发送奇怪的文件名。最终结果如下所示:
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 -