如何使用tar命令排除子目录仅打包根目录文件并输出到指定路径
解决方案
可行命令
方案1(推荐,兼容性强)
结合find筛选深度为1的文件后传给tar打包,逻辑清晰不会出错:
# 通用模板 find <目标目录路径> -maxdepth 1 -type f -exec tar -cvf <输出tar包完整路径> {} +
针对你的目录场景,要打包~/root-dir下根目录文件、输出到~/r.tar的命令为:find ~/root-dir -maxdepth 1 -type f -exec tar -cvf ~/r.tar {} +
参数说明:
-maxdepth 1限制查找范围仅为目标目录的第一层,不进入任何子目录-type f仅匹配普通文件,自动过滤掉子目录项exec {} +将所有筛选出的文件路径批量传给tar进行打包
方案2(纯tar实现)
不需要借助其他命令,直接用tar的排除规则实现:
# 通用模板 tar -cvf <输出tar包完整路径> -C <目标目录的上级目录> --exclude='*/' <目标目录名>/*
对应你的场景命令为:tar -cvf ~/r.tar -C ~ --exclude='*/' root-dir/*
参数说明:
-C ~先切换工作目录到root-dir的上级目录(即用户家目录),避免打包后的文件带不必要的绝对路径前缀--exclude='*/'匹配所有带层级路径的子目录项,全部排除,仅保留根目录下的普通文件
原命令失效原因
你之前的写法是硬编码指定要排除的子目录名称,一方面[subdir, ... ]属于字符匹配规则,不符合tar的通配符匹配逻辑,无法生效;另一方面如果子目录名称不固定、数量多,这种写法也无法覆盖所有要排除的子目录。
内容的提问来源于stack exchange,提问作者munchiis
相关产品推荐
相关产品推荐

