我想备份.zshrc
我的主目录下的所有“点文件”(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 漫画:
:)
答案1
您可以使用此命令备份目录中的所有点文件 ( .<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 ...
这确实是更合适的方法。
答案2
答案3
这个答案基于 slm,但我还将向您展示如何包含以.
要将点文件压缩到主目录中:
$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +
要包含目录:
$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +
在第一个命令中是?
可选的,但在第二个命令中不是可选的,否则find
将包含.
(当前)目录。
答案4
关于什么:
tar -C $HOME -cvzf dotfiles.tgz .