合并目录时如何阻止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删除。
- 先在目标目录的所有子目录中创建占位文件:
find 3.a/ -type d -exec touch {}/.keep \;
- 执行原patch命令:
patch -d 3.a/ -p1 -i../git.diff --verbose --remove-empty-files
- 最后清理所有占位文件:
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
相关产品推荐
相关产品推荐

