tar:添加当前目录下的所有文件和目录INCLUDING .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

如果你真的不想在tarball中包含顶级目录(这通常是个坏主意):

 tar czf workspace.tar.gz -C /path/to/workspace . 

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

 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 ..来做一个物理改变目录。愚蠢的是,这不是我的观点中的默认行为 – 至less,对于那些谁cd ..从来没有任何其他的意义混淆)。


讨论中的一个评论说:

我需要排除顶层目录,并且需要将tar放在基本目录中。

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

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

  1. 要么:在其他地方创build文件 – /tmp是一个可能的位置 – 然后在完成后将其移回原始位置。
  2. 或者:如果您正在使用GNU Tar,请使用--exclude=workspace.tar.gz选项。 =之后的string是一个模式 – 这个例子是最简单的模式 – 完全匹配。 如果您在当前目录下工作,则可能需要指定--exclude=./workspace.tar.gz 。 你可能需要指定--exclude=workspace/workspace.tar.gz如果你正在build议一个级别的工作。 如果要排除多个tar文件,请使用“ * ”,如--exclude=./*.gz

在目录下想压缩(当前目录)试试这个:

 tar -czf workspace.tar.gz . --exclude=./*.gz 

你可以修复. 通过使用--excludeforms:

 tar -czf workspace.tar.gz --exclude=workspace.tar.gz . 

您可以通过返回一个目录来包含隐藏的目录,并执行:

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

假设您想要gzip的目录被称为工作区。

其实问题是与压缩选项。 诀窍是pipe道压缩机的结果,而不是使用内置的选项。 顺便说一句,也可以给你更好的压缩,因为你可以设置额外的压缩选项。

最小的焦油:

 tar --exclude=*.tar* -cf workspace.tar . 

pipe道到您select的压缩机。 这个例子是详细的,并且使用了最大压缩的xz:

 tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz 

解决scheme在Ubuntu 14.04和Windows 7上的Cygwin上进行了testing。这是一个社区wiki的答案,所以如果你发现一个错误,随时编辑。

有几个步骤可以采取:

  1. replace* . 以包括隐藏的文件。
  2. 要在同一目录中创build归档,可以使用--exclude=workspace.tar.gz来排除归档本身。
  3. 为了防止tar: .: file changed as we read it错误,当存档尚未创build时,确保它存在(例如,使用touch ),所以–exclude和存档文件名匹配。 (它不符合它的文件不存在)

将这个结果合并到以下脚本中:

 touch workspace.tar.gz tar -czf workspace.tar.gz --exclude=workspace.tar.gz . 

更新:我为OP的评论添加了一个修复程序。

 tar -czf workspace.tar.gz . 

确实会改变当前目录,但为什么不把文件放在别的地方?

 tar -czf somewhereelse/workspace.tar.gz . mv somewhereelse/workspace.tar.gz . # Update 

一个很好的问题。 在ZSH中,您可以使用代表“dotfiles”的通配符修饰符(D) 。 比较:

 ls $HOME/* 

 ls $HOME/*(D) 

这正确排除了特殊的目录条目... 在Bash中,您可以使用.*来明确包含点文件:

 ls $HOME/* $HOME/.* 

但那包括. 而且,所以这不是你要找的东西。 我确定有一些方法可以使bash中的dotfiles匹配。

 tar -czf workspace.tar.gz .??* * 

指定.??*将包括在点之后至less有2个字符的“点”文件和目录。 不好的一面是它不会在点之后包含单个字符的文件/目录,比如.a ,如果有的话。

如果磁盘空间不是问题,这也可能是一件非常容易的事情:

 mkdir backup cp -r ./* backup tar -zcvf backup.tar.gz ./backup 

这里提供的大多数解决scheme的问题是tar在每个入口处都包含./ 。 所以这导致了. 目录通过GUI压缩器打开时。 所以我最终做的是:

ls -1A | xargs -d "\n" tar cfz my.tar.gz

如果你已经在当前目录中有my.tar.gz ,你可能想my.tar.gz

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

注意 xargs有一定的限制(参见xargs --show-limits )。 所以如果你正在尝试创build一个包含很多条目(目录和文件)的包,那么这个解决scheme将不起作用。

还有另一种解决scheme,假设文件夹中的项目数量不是很大:

 tar -czf workspace.tar.gz `ls -A` 

ls -A打印普通文件和隐藏文件,但不打印“。”和“..”。

使用find可能是最简单的方法:

 find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+ 

find . -maxdepth 1 find . -maxdepth 1将查找当前目录中的所有文件/目录/符号链接/ etc并运行由-exec指定的命令。 命令中的{}表示文件列表出现在这里\+表示该命令将以下列forms运行:

 tar zcvf workspace.tar.gz .file1 .file2 .dir3 

代替

 tar zcvf workspace.tar.gz .file1 tar zcvf workspace.tar.gz .file2 tar zcvf workspace.tar.gz .dir3