以下 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 并查看它所获取的文件。