【问题标题】:Tar only the Directory structure仅 Tar 目录结构
【发布时间】:2012-08-21 15:09:15
【问题描述】:

我想复制不包括文件的目录结构。 tar 中是否有任何选项可以忽略所有文件并仅递归复制目录。

【问题讨论】:

    标签: unix tar


    【解决方案1】:

    您可以使用 find 获取目录,然后将它们 tar:

    find .. -type d -print0 | xargs -0 tar cf dirstructure.tar --no-recursion
    

    如果您有超过 10000 个目录,请使用以下解决 xargs 限制:

    find . -type d -print0 | tar cf dirstructure.tar --no-recursion --null --files-from -
    

    【讨论】:

    • 在早期的 GNU tars 中,显然您放置 --no-recursion 参数的位置对于它的工作并不重要,而在更新的版本中,它显然需要先于--files-from 选项...从 Debian Wheezy 升级到包含 GNU tar 1.29 的 Debian Stretch 后,我的备份刚刚爆炸。我相应地编辑了答案。
    • 我已经编辑了答案并将--no-recursion移到--files-from之前。
    【解决方案2】:

    包含空格或其他特殊字符的目录名称可能需要特别注意。例如:

    $ mkdir -p "backup/My Documents/stuff"
    $ find backup/ -type d | xargs tar cf directory-structure.tar --no-recursion
    tar: backup/My: Cannot stat: No such file or directory
    tar: Documents: Cannot stat: No such file or directory
    tar: backup/My: Cannot stat: No such file or directory
    tar: Documents/stuff: Cannot stat: No such file or directory
    tar: Exiting with failure status due to previous errors
    

    以下是处理这些“不寻常”目录名称的一些变体:

    $ find backup/ -type d -print0 | xargs -0 tar cf directory-structure.tar --no-recursion
    

    -print0 与 find 一起使用会将文件名作为以空字符结尾的字符串发出;使用 -0 xargs 将以相同的方式解释参数。使用 null 作为终止符有助于确保即使是带有空格和换行符的文件名也能被正确解释。

    也可以将结果直接从find 传送到tar

    $ find backup/ -type d | tar cf directory-structure.tar -T - --no-recursion
    

    使用 -T -(或 --files-from -)调用 tar 将导致它从标准输入读取文件名,期望每个文件名由一行分隔休息。

    为了获得最大效果,这可以与空终止字符串的选项结合使用:

    $ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion
    

    我认为最后一个版本是最强大的,因为它支持不常见的文件名,并且(与 xargs 不同)本身不受系统命令行大小的限制。 (见xargs --show-limits

    【讨论】:

      【解决方案3】:
      for i in `find . -type d`; do mkdir -p /tmp/tar_root/`echo $i|sed 's/\.\///'`; done
      pushd /tmp/tar_root
      tar cf tarfile.tar *
      popd
      # rm -fr /tmp/tar_root
      

      【讨论】:

        【解决方案4】:

        进入您要开始的文件夹(这就是我们使用查找点的原因) 将tar文件保存在其他地方。我想我把它放在那里有一个错误。 带有 r 的 tar 不是 c。我认为使用 cf 您会不断创建新文件,而您只会 获取最后一组文件子目录。 tar r 附加到 tar 文件。 --no-recursion 因为 find 已经为您提供了整个文件列表 所以你不想递归。

        找到 . -type d |xargs tar rf /somewhereelse/whatever-dirsonly.tar --no-recursion

        tar tvf /somewhereelse/whatever-dirsonly.tar |more 来检查你得到了什么。

        【讨论】:

          【解决方案5】:

          对于 AIX:

          tar cvfD some-tarball.tar `find /dir_to_start_from -type d -print` 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-17
            • 2011-08-07
            • 2021-09-16
            • 1970-01-01
            • 2019-05-30
            相关资源
            最近更新 更多