仅排除 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 命令中的特定文件夹的主要内容,如果未能解决你的问题,请参考以下文章