我需要比较两个目录:
A: /path1/
B: /path2/
- 目录 A 包含 B 中的所有文件和子目录。
- A(及其子目录)中的文件可以具有与 B 中的等效文件不同的内容。
- 目录 A(及其子目录)也包含 B 中不存在的额外文件。
我想要实现的目标是:
- 仅保留 A 中与 B 中的文件不同的文件以及 B 中不存在的所有额外文件。
- 删除 A 中所有不遵守先前规则的其他文件。
答案1
这种方法应该有效:
cd /path1
find . -type f -exec cmp -s {} /path2/{} \; -delete
怎么运行的:
find . -type f
浏览当前目录中的所有文件(A) 及其子目录。cmp -s {} /path2/{}
静默地(-s
)将当前处理的文件({}
)与匹配的文件进行比较乙(/path2/{}
)。如果文件相同,cmp 返回 true 且
-exec
条件匹配。如果
-exec
条件匹配,则-delete
删除该文件。
我建议在运行实际命令之前替换-delete
为,以验证它是否按预期工作。-print
要处理剩余的空目录,可以执行以下命令:
find . -type d -exec rmdir -p {} \; 2> /dev/null
-type d
仅查找目录。-exec rmdir -p {} \;
rmdir -p {}
对找到的每个目录执行。{}
是已找到的目录,并且-p
开关使 rmdir 也删除其空的父目录。2> /dev/null
抑制因尝试删除非空目录或以前删除的目录而产生的错误消息。
由于 rmdir 不能删除非空目录,所以这应该是最安全的方法。