有没有办法执行
tar cjvf foo.tar.bz2 project-root
这样,当提取 tarball 时,它不会提取到项目根目录,而是提取到其他地方?即
tar xjvf foo.tar.bz2
cd something-else
# see all files that were within original project-root
我知道 -C,但我希望它是其他东西尚不存在的。
答案1
首先创建一个符号链接,然后让 tar 跟随它。
ln -s project-root something-else
tar cjf foo.tar.bz2 something-else/*
rm something-else
必须/*
遵循链接并选择所有内容,而不仅仅是打包符号链接本身。您也可以使用-h
GNU tar 上的选项(但这也会遵循内部链接,您可能不想这样做)或H
BSD tar 上的选项(例如在 Mac 上)。
你甚至可以从项目根目录内部执行此操作:
cd project-root
ln -s . something-else
tar cjf foo.tar.bz2 --exclude=something-else/something-else something-else/*
rm something-else
除非您明确将其排除(如上所述),否则符号链接也会存在于 tarball 中。
显然,如果您多次执行此操作并且不介意符号链接仍然存在,则不必每次都将其删除并重新创建。
答案2
您可以重命名项目根目录在 tarball 里面7-zip 图形用户界面(可能还有其他归档程序),但这可能会对压缩的 tarball 进行完整的解压缩-重新压缩循环。(请注意:对于大型、高度压缩的 tarball,这可能需要一段时间。)
执行所需操作的最佳方法是在创建 tarball 之前更改名称。一种简单的方法是临时重命名项目根目录到别的东西:
# temporary rename; tar; restore original name
$ mv project-root something-else ; tar cjf foo.tar.bz2 something-else ; mv something-else project-root
我可能会选择更复杂一点的方法:在 tarball 中用我想要的名字制作一个副本。这样可以避免在以后可能采用的修复过程中出现潜在错误或遗漏步骤,而且我可能希望保留两个副本用于其他目的。
# make me a copy
$ ( cd project-root ; tar cf - . ) | ( mkdir something-else; cd something-else; tar xf - )
# test the copy here if needed
$ diff -r --brief project-root/ something-else/
# create my tarball
$ tar cjf foo.tar.bz2 something-else