两个目录之间的差异并仅保留未更改的目录

Leo*_*rdo 5 bash diff macos

我需要区分两个目录:

 A: /path1/
 B: /path2/
Run Code Online (Sandbox Code Playgroud)
  1. 目录 A 包含也包含在 B 中的所有文件和子目录。
  2. A(及其子目录)中的文件可以与 B 中的等效文件具有不同的内容。
  3. 目录 A(及其子目录)还有 B 中不存在的额外文件。

我想实现的是:

  • 仅保留 A 中与 B 中的文件不同的文件以及 B 中不存在的所有额外文件。
  • 删除 A 中不遵守先前规则的所有其他文件。

Den*_*nis 6

这种方法应该有效:

cd /path1

find . -type f -exec cmp -s {} /path2/{} \; -delete
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • find . -type f遍历当前目录 ( A ) 及其子目录中的所有文件。

  • cmp -s {} /path2/{}静默 ( -s) 将当前处理的文件 ( {}) 与B ( /path2/{}) 中的匹配文件进行比较。

  • 如果文件相同,则 cmp 返回 true 并且-exec条件匹配。

  • 如果-exec条件匹配,则-delete删除文件。

我建议在运行实际命令之前替换-deletewith-print以验证它是否按预期工作。


要处理剩余的空目录,可以执行以下命令:

find . -type d -exec rmdir -p {} \; 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
  • -type d 只找到目录。

  • -exec rmdir -p {} \;rmdir -p {}对找到的每个目录执行。

    {}是已找到的目录,-p开关使 rmdir 也删除其空父目录。

  • 2> /dev/null 抑制因尝试删除非空或以前删除的目录而产生的错误消息。

由于 rmdir 不能删除非空目录,这应该是最安全的方法。