tar命令:在当前目录中添加包括.svn等所有文件和目录

133

我试图压缩一个目录并使用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 上使用 bash(2.6.27.19))


7
这个问题或许应该发到超级用户网站上? - Peter Jaric
16个回答

1
一个好问题。在ZSH中,您可以使用globbing修饰符(D),它代表“点文件”。比较一下:
ls $HOME/*

并且

ls $HOME/*(D)

这样可以正确地排除特殊的目录项...。在Bash中,您可以使用.*来显式包含点文件:

ls $HOME/* $HOME/.*

但这也包括...,所以这不是你要找的。我相信在bash中有一些方法让*匹配点文件。


在Bash中,使用.??*匹配所有点文件,而不是...。这不能获取单个字符的点文件(例如.a)。要获取这些文件,可以使用更复杂的.[^.]* - Scott Minster

1
这里提供的大多数解决方案存在问题,即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

请注意,xargs有一定的限制(请参见xargs --show-limits)。因此,如果您试图在一个包含许多条目(目录和文件)的目录中创建软件包,则此解决方案将无法正常工作。


1

十年后,你有一个替代tar的选择,这个选择是使用Git 2.30 (2021年第一季度)进行说明,它使用 "git archive"(man) 来生成发布tar包,而不是tar。
(您不需要Git 2.30来应用此替代方案)

请参阅提交 4813277(2020年10月11日)和提交 93e7031(2020年10月10日),作者为René Scharfe (rscharfe)
(由Junio C Hamano -- gitster --于2020年10月27日合并至提交 63e5273

Makefile:使用git init/add/commit/archive来生成dist-doc

签名:René Scharfe

通过使用git(man)命令生成HTML文档和man页的分发存档,减少对外部工具的依赖,而不是使用tar。这样可以使归档条目与二进制文件的dist归档中的元数据相同。

所以,不是:

tar cf ../archive.tar .

你只能使用Git来完成:

git -C workspace init
git -C workspace add .
git -C workspace commit -m workspace
git -C workspace archive --format=tar --prefix=./ HEAD^{tree} > workspace.tar
rm -Rf workspace/.git

最初提出这个建议是因为,如 这里所解释的那样,一些奇特的平台可能会有一个缺乏选项的旧tar发行版。


0
如果磁盘空间不是问题,这也可能是一件非常容易的事情:
mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup

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

指定.??*将包括“点”文件和至少在点后有2个字符的目录。缺点是它不会包括只有一个字符的点之后的文件/目录,例如 .a ,如果有的话。

-2

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

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

find . -maxdepth 1 命令将在当前目录中查找所有文件/目录/符号链接等,并运行由 -exec 指定的命令。命令中的 {} 表示文件列表在此处,而 \+ 表示该命令将被执行为:

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

在手册中,-J是--xz;结合-c只是计算机所谓“有趣”开始的开端 :) - Ricalsin
哈哈,我家里的小型服务器受限于磁盘空间而不是 CPU :) 不过说得好,我会改用 gzip。 - Andrew Gunnerson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接