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

合并目录时如何阻止patch命令删除空父级目录?

如何阻止patch命令删除空的父级目录?

我需要将两个目录间的变更合并至第三个目录,目前用patch命令合并文件,自定义脚本处理空目录的创建与删除。但patch删除空输出文件时会连带删除空的父级目录,这会破坏合并流程,我需要保留删除空文件的功能,但阻止删除父目录。

方法1:使用patch内置选项(推荐)

GNU Patch 2.7.6及以上版本自带--no-directory-removal(也可简写为--no-dir-remove)选项,专门用来阻止patch在删除空文件后递归删除空的父目录。搭配--remove-empty-files(或短选项-E)就能同时实现删除空文件、保留空父目录的需求。

修改你的patch命令:

patch -d 3.a/ -p1 -i../git.diff --verbose --remove-empty-files --no-directory-removal

执行后,patch会正常删除空文件,但不会删除dir01、dir02这类空父目录,完全符合合并流程要求。

方法2:添加占位文件兼容旧版patch

如果你的patch版本较旧,没有--no-directory-removal选项,可以通过给目录添加占位文件的方式,让目录始终不为空,从而避免被patch删除。

  1. 先在目标目录的所有子目录中创建占位文件:
find 3.a/ -type d -exec touch {}/.keep \;
  1. 执行原patch命令:
patch -d 3.a/ -p1 -i../git.diff --verbose --remove-empty-files
  1. 最后清理所有占位文件:
find 3.a/ -name ".keep" -delete

这种方法通过占位文件让目录保持非空,patch不会触发删除逻辑,清理后也不会留下多余文件。

示例验证

执行上述方法后,tree -ahN的输出会保留3.a下的dir01和dir02目录:

.
├── [   0]  3.a
│	├── [   0]  dir01
│	└── [   0]  dir02
├── [   0]  a
│	├── [   0]  dir01
│	│	├── [ 693]  file00
│	│	├── [ 693]  file01
│	│	├── [ 693]  file02
│	│	├── [ 693]  file03
│	│	├── [ 693]  file04
│	│	└── [   0]  file05
│	└── [   0]  dir02
│		└── [   4]  file01
├── [   0]  b
│	├── [   0]  dir01
│	└── [   0]  dir02
└── [4.3K]  git.diff

内容的提问来源于stack exchange,提问作者user19087

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:15:27