tar:添加当前目录中的所有文件和目录,包括 .svn 等

新手上路,请多包涵

我尝试 tar.gz 一个目录并使用

tar -czf workspace.tar.gz *

生成的 tar 包括 .svn 子目录中的目录,但不在当前目录中(因为 * 在传递给 tar 之前仅扩展为“可见”文件

我尝试过了

tar -czf workspace.tar.gz . 但后来我收到一个错误,因为’。’阅读时发生了变化:

 tar: ./workspace.tar.gz: file changed as we read it

是否有技巧使 * 匹配目录中的所有文件(包括点前缀)?

(在 Linux SLES-11 (2.6.27.19) 上使用 bash

原文由 Micha 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 769
1 个回答

不要在要打包的目录中创建 tar 文件:

 tar -czf /tmp/workspace.tar.gz .

做的伎俩,除了它会在你解压缩时提取当前目录中的所有文件。更好的做法:

 cd ..
tar -czf workspace.tar.gz workspace

或者,如果您不知道所在目录的名称:

 base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(这假设您没有按照符号链接到达您所在的位置,并且 shell 不会尝试通过符号链接向后跳来猜测您 - bash 在这方面是不可信的。如果您必须担心这一点,使用 cd -P .. 进行物理更改目录。愚蠢的是,这不是我认为的默认行为 - 至少对于那些 cd .. 从来没有任何替代的意思。)


讨论中的一条评论说:

我 […] 需要排除顶级目录,我 […] 需要将 tar 放在基目录中。

注释的第一部分没有多大意义 - 如果 tar 文件包含当前目录,则从该存档中提取文件时不会创建它,因为根据定义,当前目录已经存在(除非在非常奇怪的情况下)。

可以通过以下两种方式之一处理评论的第二部分:

  1. 要么:在其他地方创建文件 - /tmp 是一个可能的位置 - 然后在完成后将其移回原始位置。
  2. 或者:如果您使用的是 GNU Tar,请使用 --exclude=workspace.tar.gz 选项。 = 之后的字符串是一个模式 - 示例是最简单的模式 - 完全匹配。如果您违反建议在当前目录中工作,您可能需要指定 --exclude=./workspace.tar.gz ;您可能需要指定 --exclude=workspace/workspace.tar.gz 如果您按照建议进行上一级工作。如果要排除多个 tar 文件,请使用 ‘ * ‘,如 --exclude=./*.gz

原文由 Jonathan Leffler 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题