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

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

我想备份.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 漫画:

xkcd 1168:)

答案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

这种对匹配文件的控制远远超出了 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将包含.(当前)目录。

答案4

关于什么:

tar -C $HOME -cvzf dotfiles.tgz .

相关内容