You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用find和tar备份时出现文件重复问题的原因咨询

问题原因分析

这个重复打包的问题其实是find命令的输出内容与tar处理路径的逻辑共同作用导致的,咱们一步步拆解:

  1. find的默认输出行为
    你执行的find d1 d2 -print0,默认会输出:

    • 你指定的顶层目录d1、d2本身
    • 以及d1、d2递归下的所有文件、子目录、子目录里的文件等所有条目
      虽然这些输出条目本身没有重复,但包含了顶层目录和其下所有内容的独立路径。
  2. tar处理-T输入的逻辑
    GNU tar的-T(--files-from)选项会按顺序逐个处理传入的路径:

    • 当它读到d1这个目录路径时,会自动递归打包d1下的所有内容(包括d1/file1、d1/subdir/file2等)
    • 之后当它读到d1/file1、d1/subdir/file2这些单独的文件路径时,会再次把这些文件打包进tar包
      这就导致了同一个文件在tar包里出现两次:一次是作为d1目录的递归内容,一次是作为单独的文件条目。
  3. 直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:25:52