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它,因为根据定义,当前目录已经存在(除非是非常奇怪的情况)。
评论的第二部分可以通过以下两种方式之一来处理:
- 要么:在其他地方创build文件 –
/tmp
是一个可能的位置 – 然后在完成后将其移回原始位置。 - 或者:如果您正在使用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
你可以修复.
通过使用--exclude
forms:
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的答案,所以如果你发现一个错误,随时编辑。
有几个步骤可以采取:
- replace
*
.
以包括隐藏的文件。 - 要在同一目录中创build归档,可以使用
--exclude=workspace.tar.gz
来排除归档本身。 - 为了防止
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