使用tar创建存档,包括所有“ dotfiles”,但不包括所有子目录和/ wo目录结构


18

我想.zshrctar备份主目录下的所有'dotfiles'(fe ),但不包括目录结构和所有子目录。

我已经使用不同的命令尝试了几次,但是获得的最好成绩是一个存档,其中也包含了隐藏目录$HOME

#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*

我还考虑过使用find结果并将其传递到tar,但是没有运气。有人知道如何实现这一看似简单的任务吗?

PS:大多数时候,当我使用tar创建档案时,我不得不考虑xkcd comic:

xkcd 1168 :)


sim的答案有效,但是如果有人得到仅与隐藏文件匹配的正则表达式,请发布!
klingt.net

1
当然,使用您的外壳会更好。据我所知,有zsh的只选择文件的水珠- *(.)-我认为它排除....*默认(他们会不会被拾起.*(.)无论如何,因为它仅选择文件)。我自己不使用zsh,因此我不确定将其转化为答案。
evilsoup

Answers:


14

您可以使用此命令备份目录中的所有dotfile(.<something>$HOME

$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +

正则表达式仅使用tar?

方法1

我对此进行了相当多的研究,结果空白了。限制因素是,在tar执行时将其排除在外,/当tar执行其模式匹配时,与目录一起显示的尾部斜杠()不是等式的一部分。

这是一个例子:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory

此变体包括一个排除项.*/,您可以通过打开tar的详细开关来查看-v这些目录正在通过该排除项。

方法#2

我以为可能会切换,--no-wildcards-match-slash还是--wildcards-match-slash会放松的贪婪,.*/但这也没有效果。

将斜杠排除在排除之外.*也不是一个选择,因为这将告诉tar您排除所有点文件和点目录:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$

方法3(丑陋!)

因此,我能想到的唯一其他选择是为提供文件列表tar。像这样:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory

如果文件数超过了将参数传递给命令的最大空间,这种方法就会出现问题。另一个是丑陋且过于复杂。

那我们学到了什么?

使用tar&正则表达式似乎没有一种简单而优雅的方法来完成此任务。因此,@ terdon的评论find ... | tar ...确实是更合适的方法。


我真的很想解决这个问题regex,但我应该知道它不会那样工作:)
klingt.net

@ klingt.net-应该有可能,我现在正在寻找。
slm

@ klingt.net您为什么更喜欢更复杂的方法?使用regex您可能需要转义前导点,并且在忽略.和时会遇到麻烦..。我相信这是有可能的,因为slm可能会演示,但是我不明白为什么这样做会值得。
terdon

1
@ klingt.net- find命令找到的所有内容都作为参数传递给tar。该{}说你想要的结果在相应的去-exec命令。该+说,并将其添加为许多成果find,这将适合在命令行上,并呼吁tar只有几次,而不是每次的结果被发现的时间。
slm

1
@ klingt.net-无法使用来完成此操作regextar因为无法隔离点目录(.blah/)。在执行排除操作时,Tar不会使用斜杠。
slm

4

这种对匹配文件的控制超出了tar的舒适范围。其匹配文件的规则仅限于名称的简单匹配。

find 是一种方法,但是由于有了zsh,因此更容易:

tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)

.在通配符表达的末尾括号是水珠预选赛,说:“只匹配常规文件”。

常规文件的符号链接不匹配。如果更改为.*(-.),则将包含这些文件,但是除非同时包含文件,否则该文件也不会最终出现在归档文件中。如果要用其目标替换符号链接,请执行此操作.*(-.:A)—  :A历史记录扩展修饰符将所有符号链接解析为不使用符号链接的路径。


3

这个答案是基于slm的,但我还将向您展示如何包含以以下内容开头的目录 .

要压缩您的主目录中的点文件:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

要包括目录:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

?一个命令中的可选,但第二个命令中的可选,否则find将包含.(当前)目录。


1

关于什么:

tar -C $HOME -cvzf dotfiles.tgz .
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.