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

如何创建不含实际文件数据的‘浅’tar归档?

仅归档目录结构、文件名及文件大小的tar归档方案

针对你需求的“生成无实际文件数据、仅含目录结构/文件名/文件大小的tar归档”,以下是几种高效可行的方案,解决你之前tmpfs+lndir内存不足的问题:

方案一:轻量tmpfs+空文件占位(命令行友好)

无需创建符号链接,而是在极小的tmpfs中创建对应目录和仅保留原文件大小的空文件,空文件的内存/磁盘占用远低于符号链接,适合大型目录:

# 1. 创建临时挂载点并挂载小容量tmpfs(1G足够处理百万级文件)
mkdir /tmp/tar-skeleton
mount -t tmpfs -o size=1G tmpfs /tmp/tar-skeleton

# 2. 复制目录结构到tmpfs
find /media/usb1 -type d -exec mkdir -p /tmp/tar-skeleton/{} \;

# 3. 创建对应空文件并设置原文件的大小
find /media/usb1 -type f -exec truncate -s $(stat -c %s {}) /tmp/tar-skeleton/{} \;

# 4. 生成tar归档
tar -cf usb1-filelist.tar -C /tmp/tar-skeleton media/usb1

# 5. 清理临时资源
umount /tmp/tar-skeleton
rmdir /tmp/tar-skeleton

优势:

  • 仅依赖基础Linux工具,无需额外安装
  • tmpfs占用极低,空文件仅消耗inode和少量元数据空间
  • 保留原文件的大小、目录结构,tar归档可直接查看层级

方案二:Python脚本生成精准归档(灵活可控)

如果tar自身的命令行参数无法完全满足需求,用Python的tarfile模块可以直接生成仅含元数据的tar归档,全程无临时文件/内存镜像,内存占用极低:

import tarfile
import os

def generate_skeleton_tar(source_path, output_tar):
    """生成仅含目录结构、文件元数据(无内容)的tar归档"""
    with tarfile.open(output_tar, 'w') as tar_handle:
        # 遍历目标目录的所有层级
        for root, dirs, files in os.walk(source_path):
            # 处理目录条目
            rel_dir = os.path.relpath(root, source_path)
            # 处理根目录的特殊情况
            if rel_dir == '.':
                rel_dir = ''
            dir_info = tarfile.TarInfo(name=rel_dir)
            dir_info.type = tarfile.DIRTYPE
            dir_stat = os.stat(root)
            dir_info.mode = dir_stat.st_mode
            dir_info.mtime = dir_stat.st_mtime
            dir_info.uid = dir_stat.st_uid
            dir_info.gid = dir_stat.st_gid
            tar_handle.addfile(dir_info)

            # 处理文件条目(仅元数据,无内容)
            for file_name in files:
                full_file_path = os.path.join(root, file_name)
                rel_file = os.path.relpath(full_file_path, source_path)
                file_stat = os.stat(full_file_path)
                file_info = tarfile.TarInfo(name=rel_file)
                file_info.type = tarfile.REGTYPE
                file_info.mode = file_stat.st_mode
                file_info.size = file_stat.st_size  # 保留原文件大小
                file_info.mtime = file_stat.st_mtime
                file_info.uid = file_stat.st_uid
                file_info.gid = file_stat.st_gid
                # 写入空内容
                tar_handle.addfile(file_info, fileobj=None)

# 调用示例
generate_skeleton_tar('/media/usb1', 'usb1-filelist.tar')

优势:

  • 完全不依赖临时存储,内存占用仅为遍历目录的开销
  • 精准保留原文件的所有元数据(大小、权限、时间戳、用户组)
  • 可灵活扩展(比如添加过滤规则、自定义元数据)

方案三:tar增量备份的“另类”用法(仅作探索)

tar的增量备份特性可以被用来仅归档结构,但需要特殊处理,实用性不如前两种方案,仅作极限探索:

# 创建空的快照文件
touch /tmp/empty-snapshot.snar

# 强制tar仅记录元数据(实际仍会归档内容,需额外过滤,不推荐)
tar -cf usb1-filelist.tar --listed-incremental=/tmp/empty-snapshot.snar --no-check-device --exclude='*' /media/usb1

注:此方法实际无法完全过滤文件内容,仅作tar功能极限探索,不建议生产使用。


内容的提问来源于stack exchange,提问作者ccpizza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:58:10