我想创建一个适合解压到 .tar 文件中的 tar 文件/
。我创建了一个代表文件系统根的工作目录,它包含我想要包含在下面的 tar 中的所有内容,例如:etc/rc.d/init.d/glassfish3
、opt/glassfish3/...
以及 下的其他目录和文件opt/...
。
当我这样做时,它会在 tar 文件中tar zcvpf files.tgz *
包含中间目录(如etc
、etc/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 {} +