我尝试 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 文件包含当前目录,则在您从该存档中提取文件时不会创建它,因为根据定义,当前目录已经存在(除了非常奇怪的情况)。
评论的第二部分可以通过以下两种方式之一处理:
/tmp
是一个可能的位置 - 然后在完成后将其移回原始位置。--exclude=workspace.tar.gz
选项。 =
之后的字符串是一个模式 - 示例是最简单的模式 - 完全匹配。如果您违反建议在当前目录中工作,您可能需要指定 --exclude=./workspace.tar.gz
;如果您按照建议上一级,您可能需要指定 --exclude=workspace/workspace.tar.gz
。如果要排除多个 tar 文件,请使用“*
”,如 --exclude=./*.gz
。https://stackoverflow.com/questions/3651791/