使用find和tar备份时出现文件重复问题的原因咨询
问题原因分析
这个重复打包的问题其实是find命令的输出内容与tar处理路径的逻辑共同作用导致的,咱们一步步拆解:
find的默认输出行为
你执行的find d1 d2 -print0,默认会输出:- 你指定的顶层目录
d1、d2本身 - 以及
d1、d2递归下的所有文件、子目录、子目录里的文件等所有条目
虽然这些输出条目本身没有重复,但包含了顶层目录和其下所有内容的独立路径。
- 你指定的顶层目录
tar处理
-T输入的逻辑
GNU tar的-T(--files-from)选项会按顺序逐个处理传入的路径:- 当它读到
d1这个目录路径时,会自动递归打包d1下的所有内容(包括d1/file1、d1/subdir/file2等) - 之后当它读到
d1/file1、d1/subdir/file2这些单独的文件路径时,会再次把这些文件打包进tar包
这就导致了同一个文件在tar包里出现两次:一次是作为d1目录的递归内容,一次是作为单独的文件条目。
- 当它读到
直接用tar打包目录的差异
当你直接执行tar czvf backup.tar.gz d1 d2时,tar只会处理d1和d2两个顶层目录,递归打包它们的内容,不会额外处理目录下的单个文件路径,因此不会出现重复。
可选解决办法
如果你想继续用find + tar的组合避免重复,可以调整find命令:
- 只打包文件(不包含目录本身):
find d1 d2 -type f -print0 | tar -czvf backup.tar.gz --null -T - - 排除顶层目录本身,只打包其下内容:
find d1 d2 -mindepth 1 -print0 | tar -czvf backup.tar.gz --null -T -(注意:这样tar包里的文件会保留d1/xxx的路径结构,不会丢失层级)
内容的提问来源于stack exchange,提问作者Robert Murphy
相关产品推荐
相关产品推荐

