Linux下使用find匹配NE开头子目录并分别单独压缩为tar.gz的方法
错误原因分析
你原来的命令不符合预期主要有两个核心问题:
- 命令中的
NE*.tar.gz会在find执行前被shell提前展开通配符:如果当前目录不存在匹配的NE前缀tar.gz文件,会直接把NE*.tar.gz作为固定文件名,所有匹配到的目录都会被打包进同一个文件;如果已有匹配的文件,会直接用展开后的第一个文件名作为打包目标,完全达不到每个目录单独打包的要求。 - 没有对每个匹配到的目录做动态的文件名映射,无法生成和目录名一一对应的tar.gz包。
正确命令写法
基础版(打包结果带目录相对路径)
find . \( -iname 'NE*' -type d \) -exec sh -c 'tar -czvf "${1##*/}.tar.gz" "$1"' sh {} \;
优化版(打包结果仅保留纯目录名,解压直接生成对应NE目录)
find . \( -iname 'NE*' -type d \) -exec sh -c 'dir_name=${1##*/}; tar -czvf "${dir_name}.tar.gz" -C . "${dir_name}"' sh {} \;
参数说明
- 用
sh -c包裹打包逻辑,避免shell提前解析通配符,实现动态生成打包文件名 ${1##*/}是shell参数替换语法,会自动去掉匹配到的目录路径前缀(比如把./NE1处理为NE1),用来生成和目录名对应的打包文件名- 末尾的
sh是给sh -c的$0占位,避免第一个匹配到的目录被误当做$0参数消耗 -C .参数会让tar在打包时切换到当前目录,不会把./前缀打进压缩包,解压体验更好
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

