You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:32:53