仅排除 tar 命令中的特定文件夹

Posted

技术标签:

【中文标题】仅排除 tar 命令中的特定文件夹【英文标题】:Exclude only specific folder in tar command 【发布时间】:2020-01-09 16:44:50 【问题描述】:

我想 tar 一个如下所示的目录:

dir
└── workspace
└── node_modules
└── subfolder
    └── workspace
    └── node_modules
    └── other_folder

我想排除 所有 个名为 node_modules 的文件夹并排除名为 workspace 的***文件夹,但不排除名为 workspace 的子文件夹。 所以我想结束的是:

dir
└── subfolder
    └── workspace
    └── other_folder

我正在运行这个命令:tar -czf ./output.tar.gz --exclude=node_modules --exclude=./workspace dir/.

但它正在删除 所有 文件夹,称为工作区 node_modules,所以我最终得到了这个:

dir
└── subfolder
    └── other_folder

如何只删除我想要的特定工作区文件夹,而不是所有同名文件夹?

【问题讨论】:

所以对于更复杂的事情,使用find 创建要压缩的文件列表。然后将此列表传递给 tar,最好使用xargs -0 或类似方法。 实际的文件夹结构比这复杂得多,包括大量的文件和文件夹。我想排除而不包括,因为我只排除两个文件夹,并且排除标志在那里并且可以采用模式,据我了解 【参考方案1】:

find 有很多很多很多选项,用于包括、排除路径、文件、目录,通常是您想要的过滤选项。

对于你的情况,我认为是:

# exclude all folders named node_modules
# exclude the top level folder called workspace
# but no sub folders called workspace
find dir -type f \
    -not -regex '.*/node_modules/.*' -a \
    -not -regex 'dir/workspace/.*' \
    -exec tar -czf ./output.tar.gz  +

您可能更喜欢-exec,例如find ... -print0 | xargs -0 tar -czf ./output.tar.gz。我认为最好的是find ... -print0 | tar -czf ./output.tar.gz --null -T -,因为如果文件太多,它不会失败,即。我认为有太多参数无法传递给tar

我重新创建了dir 目录:

while read l; do
    mkdir -p "$(dirname "$l")"
    touch "$l"
done <<EOF
dir/workspace/1.txt
dir/node_modules/2.txt
dir/subfolder/workspace/3.txt
dir/subfolder/node_modules/4.txt
dir/subfolder/other_folder/5.txt
EOF

然后tested on repl 和tar -tf ./output.tar.gz 打印:

dir/subfolder/workspace/3.txt
dir/subfolder/other_folder/5.txt

【讨论】:

【参考方案2】:

对于需要的情况,可以使用 tar 排除:

--exclude dir/./folder -- 直接应用于dir下的文件夹 --exclude folder -- 将排除树中任意位置的文件夹

应该可以使用:

tar -czf ./output.tar.gz --exclude=node_modules --exclude=dir/./workspace dir/.

当然可以使用--files-from,并使用其他工具生成列表。当列表可能包含大量文件时,这通常是首选,而不是使用 xargs

find dir/. -type f ... | tar cvz ./output.tar.gz -T-

【讨论】:

以上是关于仅排除 tar 命令中的特定文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何排除文件/文件夹以删除[重复]

linux使用tar命令打包压缩时排除某个文件夹或文件

linux下面tar打包, 排除某个特定的目录( 只对一个目录操作, 不对其他目录操作)

【tar】tar命令exclude选项排除指定文件或目录

linux tar压缩排除某个文件夹

linux tar压缩排除某个文件夹