我尝试tar.gz一个目录并使用
tar -czf workspace.tar.gz *
生成的tar包含子目录中的 .svn
目录但不在当前目录中(因为 *
在传递给tar之前只扩展为'visible'文件)
我试过了
tar -czf workspace.tar.gz .
而是然后我收到一个错误,因为'.'在阅读时发生了变化:
tar: ./workspace.tar.gz: file changed as we read it
是否有一个技巧,以便 *
匹配目录中的所有文件(包括点前缀)?
(在Linux SLES-11上使用bash(2.6.27.19)
15 回答
不要在要打包的目录中创建tar文件:
诀窍,除了它将在解压缩时提取当前目录中的文件 . 更好:
或者,如果您不知道您所在目录的名称:
(这假设你没有尝试通过向后跳过符号链接来猜测你 - 在这方面
bash
不值得信任 . 如果你不得不担心,请使用cd -P ..
来做一个物理更改目录 . 愚蠢的是它不是我视图中的默认行为 - 至少对于那些从未有过任何替代意义的人来说是令人困惑的 . )讨论中的一条评论说:
注释的第一部分没有多大意义 - 如果tar文件包含当前目录,则从该存档中提取文件时不会创建它,因为根据定义,当前目录已存在(除非在非常奇怪的情况下) ) .
评论的第二部分可以通过以下两种方式之一来处理:
或者:在其他地方创建文件 -
/tmp
是一个可能的位置 - 然后在完成后将其移回原始位置 .或者:如果您使用的是GNU Tar,请使用
--exclude=workspace.tar.gz
选项 .=
之后的字符串是一个模式 - 示例是最简单的模式 - 完全匹配 . 如果您在当前目录中工作而不是建议,则可能需要指定--exclude=./workspace.tar.gz
;如果您按照建议操作一个级别,则可能需要指定--exclude=workspace/workspace.tar.gz
. 如果要排除多个tar文件,请使用“*
”,如--exclude=./*.gz
.如果你真的不喜欢,那么:
有几个步骤:
将
*
替换为.
以包含隐藏文件 .要在同一目录中创建存档,可以使用
--exclude=workspace.tar.gz
来排除存档本身 .为了防止在尚未创建存档时出现
tar: .: file changed as we read it
错误,请确保它存在(例如,使用touch
),因此--exclude与存档文件名匹配 . (它不匹配文件不存在)结合这导致以下脚本:
在目录中想压缩(当前目录)试试这个:
您可以通过返回目录并执行以下操作来包含隐藏目录:
假设你想要gzip的目录叫做workspace .
您可以使用
--exclude
修复.
表单:Update: 我为OP的评论添加了修复程序 .
确实会更改当前目录,但为什么不将文件放在其他位置呢?
实际上问题在于压缩选项 . 诀窍是将tar结果输出到压缩器而不是使用内置选项 . 顺便提一下,这也可以为您提供更好的压缩,因为您可以设置额外的压缩选项 .
最小焦油:
管道到您选择的压缩机 . 此示例很详细,并使用xz进行最大压缩:
解决方案在Ubuntu 14.04和Windows 7上的Cygwin上进行了测试 . 这是社区维基的答案,如果发现错误,请随时编辑 .
一个好问题 . 在ZSH中,您可以使用globbing修饰符
(D)
,它代表"dotfiles" . 相比:和
这正确地排除了特殊目录条目
.
和..
. 在Bash中,您可以使用.*
显式包含dotfiles:但是那包括
.
和..
,所以它确实有一些方法可以在bash中制作*
匹配的dotfiles .指定
.??*
将包含"dot"个文件和目录点后至少2个字符 . 不利的一面是它不包括点后面有单个字符的文件/目录,如.a
,如果有的话 .如果磁盘空间不是问题,这也可能是一件非常容易的事情:
这里提供的大多数解决方案的问题是tar在每个条目的开头都包含
./
. 因此,当通过GUI压缩器打开时,这会产生.
目录 . 所以我最终做的是:ls -1A | xargs -d "\n" tar cfz my.tar.gz
如果你当前目录中已经有
my.tar.gz
,你可能想要这样做:ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz
Be aware of 表示xargs有一定限制(见
xargs --show-limits
) . 因此,如果您尝试在要尝试tar的目录上创建包含大量条目(目录和文件)的包,则此解决方案将无法工作 .另一个解决方案,假设文件夹中的项目数量不是很大:
(
ls -A
打印正常和隐藏文件,但不打印"."和"..",如ls -a
. )我自己也有类似的情况 . 我认为最好在别处创建tar,然后使用-C告诉tar压缩文件的基目录 . 例:
这样就不需要排除自己的tarfile了 . 如其他评论中所述,-A将列出隐藏文件 .
使用
find
可能是最简单的方法:find . -maxdepth 1
将在当前目录中找到所有文件/目录/符号链接/ etc,并运行-exec
指定的命令 . 命令中的{}
表示文件列表在此处,\+
表示该命令将以下列方式运行:代替