如何对点文件进行 tar 操作,但不对点目录进行 tar 操作

如何对点文件进行 tar 操作,但不对点目录进行 tar 操作

以下 tar 命令将排除所有点文件和点目录。

tar -cvzf /media/bjackfly/bkup/bkup.gz --exclude '.*' --one-file-system /home/bjackfly

就我而言,我希望将点文件备份到主目录(.vimrc.bashrc)等中,但不备份点目录/.config /.cache /.eclipse等。

有没有 Linux 专家有这个命令,还是我需要在 tar 中运行 find 或执行两个不同的 tar 命令,这不是很理想吗?一个用于主目录中的点文件,另一个用于其他所有内容?

答案1

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

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

如果要包含目录:

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

?在第一个命令中是可选的,但在第二个命令中不是,否则将find包含'.'目录。

(灵感来自这里

答案2

我不知道如何一次性完成此操作,但您可以运行命令并创建一个 tar 文件,然后使用该find命令附加丢失的 . 目录。

就像是$ find -type d -regex '\..+' -exec tar -r {} /media/bjackfly/bkup/bkup.gz \;

我没有测试过此命令,因为我使用的是 Windows 计算机,无法访问 shell,但您应该能够使用此命令或其变体执行此操作。我不确定此命令是否会选择...目录。

干杯。

答案3

使用查找逻辑运算符-and-or选择所有不以“。”开头的文件和目录:

tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system $(find /home/bjackfly -type f -or -type d -and -not -name '.*' )

编辑 slhck 评论说上述解决方案无法处理包含空格的文件名。这是一个解决方案,也许有人知道更优雅的技术?

find . -type f -or -type d -and -not -name '.*' >/tmp/tar.$$
tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system /home/bjackfly -T /tmp/tar.$$
rm /tmp/tar.$$

答案4

不,不是那样的。如果您想要备份平面目录结构中的所有文件而不进行递归,请使用:

tar cvf backupfile.tar -C /specify/dir --no-recursion '.*'

不幸的是,这会备份带有点目录的点文件。好消息是,目录内容将不会被备份。

否则,如果文件名没有换行符,您可以使用:

cd /some/dir
find ./ -minlevel 1 -maxlevel 1 -type f -name '.*'|tar cvf backupfile.tar -T - --no-recursion

查找 -T 选项。使用参数 '-',从其标准输入获取文件列表。列表由 find 命令生成。这种方法更好,因为您不受最大命令长度的限制,如其他人给出的示例,例如 tar ....something $(find) 或 find ...| xargs ... tar ..something... {} 将完整文件列表作为 tar 命令参数。这可以溢出命令大小限制。

在这种情况下,选项--no-recursion 只是为了安全性。因此,当 tar 获取某个目录时,tar 不会针对该目录结构进行操作。它与 find 结合使用非常有用。

通过这种方法,您可以运行(无需备份)命令 find 并查看它所获取的文件。

相关内容