如何创建不含实际文件数据的‘浅’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
相关产品推荐
相关产品推荐

