tar:如何排除中间目录但包含叶目录?

tar:如何排除中间目录但包含叶目录?

我想创建一个适合解压到 .tar 文件中的 tar 文件/。我创建了一个代表文件系统根的工作目录,它包含我想要包含在下面的 tar 中的所有内容,例如:etc/rc.d/init.d/glassfish3opt/glassfish3/...以及 下的其他目录和文件opt/...

当我这样做时,它会在 tar 文件中tar zcvpf files.tgz *包含中间目录(如etcetc/rc.d和)。opt然后,当我将其提取到/另一个系统上时,它会出现不良行为,即破坏这些目录的所有权和权限。我真的很想把它们留在一边,不要碰它们。

所以我想我找到了解决这个问题的好方法:

find . -type f -print0 | tar zcvpf files.tgz --null --files-from -

它创建一个仅包含文件的 tar。这太棒了,它只获取我放入其中的文件...除了我刚刚发现它没有获取重要的叶目录,例如:

opt/glassfish3/glassfish/lib/asadmin

这是一个空目录(Glassfish3 需要它,否则它会抱怨)。

如何创建跳过中间目录但不跳过最终目录的 tar 文件?我有一种感觉,一些 find+awk 魔法可能会做到这一点。不过,它不一定是一行行,可读性很重要。谢谢。


编辑: 我找到了这个。欢迎其他/更好的想法:

cat <(find . -type f -print0) <(find . -type d -empty -print0) | tar zcvpf files.tgz --null --files-from -

答案1

find可以采用“或”,因此您可以像这样-o组合两个命令:find

find . \( -type f -o -type d -empty \) -print0 | tar ...

或者,如果您可以保证所有文件都可以放在一个命令行中,

find . \( -type f -o -type d -empty \) -exec tar cvfz files.tgz {} +

相关内容