linux - 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

最佳答案

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

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

可以解决问题,只是当您解压缩时,它会提取当前目录中的所有文件。更好的做法:

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

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

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

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


讨论中的一条评论说:

I [...] need to exclude the top directory and I [...] need to place the tar in the base directory.

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

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

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

https://stackoverflow.com/questions/3651791/

相关文章:

python - 了解python的主要方法

python - 在python中调用带有参数列表的函数

c - 如何在 C 中使用/dev/random 或 urandom?

python - Jinja2 简写条件

linux - 如何在 Linux 上的某个时间运行脚本?

python - 在 localhost 上,我如何选择一个空闲端口号?

python - 更新不同深度的嵌套字典的值

linux - 如何连接两个字符串以构建完整路径

python - 如何查看安装了哪个版本的nltk、scikit learn?

python - 为什么字典和集合中的顺序是任意的?