在Bash中仅排除根目录压缩文件夹的最优方法
在Bash中仅排除根目录压缩文件夹的最优方法
针对你的目录结构需求(压缩后zip文件仅保留f文件夹及其内部的file,去掉外层的f1/f2/f3前缀),以下是两种更优的实现方式:
方法1:子shell切换目录(通用且安全)
无需手动切换目录再返回,利用子shell的特性,执行完自动回到原工作目录:
for folder in */; do (cd "$folder" && zip -r "../${folder%/}.zip" f/) done
这种方式避免了pushd/popd可能带来的目录残留问题,逻辑更简洁,且兼容所有支持Bash的环境。
方法2:GNU zip专属的--strip-components选项
如果你的系统使用的是GNU zip(绝大多数Linux发行版默认采用),可以直接通过参数指定要剥离的目录层数:
for folder in */; do zip -r --strip-components=1 "${folder%/}.zip" "$folder"f/ done
--strip-components=1会移除路径的第一层(也就是f1/、f2/这类外层目录),直接保留f/及内部文件结构,一步到位完成需求。
为什么你之前的尝试不符合预期
zip -r f1.zip f1//zip -r f1.zip f1/f:会完整保留原路径前缀(如f1/f/),不符合仅保留f的需求-j参数:会剥离所有目录结构,只保留单个文件,丢失了f文件夹层级- 原
pushd/popd脚本可以实现需求,但子shell或--strip-components的方式更简洁高效
内容的提问来源于stack exchange,提问作者suren
相关产品推荐
相关产品推荐

