【问题标题】:What's the best way to perform a differential between a list of directories?在目录列表之间执行差异的最佳方法是什么?
【发布时间】:2011-04-12 17:36:21
【问题描述】:

我有兴趣查看目录列表并将先前的列表与当前的目录列表进行比较,并设置一个脚本来执行此操作。也许在 perl 中或作为 shell 脚本。

我应该使用 diff 之类的东西吗?以编程方式,执行此操作的理想方法是什么?例如,假设我将 diff 输出到输出文件,如果没有 diff 则退出,如果有结果,我想查看它。

例如,我今天有以下目录:

/foo/bar/staging/abc
/foo/bar/staging/def
/foo/bar/staging/a1b2c3

第二天会像这样添加或重命名目录:

/foo/bar/staging/abc
/foo/bar/staging/def
/foo/bar/staging/ghi
/foo/bar/staging/a1b2c4

【问题讨论】:

  • 只是好奇,您打算如何处理这些信息?我的 unix 工具感觉很刺痛。
  • 只需要报告差异,因为还有另一个添加、创建目录的过程,如果有变化,我需要知道发生了什么变化。如果发生这种变化,我可能会将其设置为通过电子邮件发送给我。

标签: perl shell unix


【解决方案1】:

可能有更好的方法,但我通常这样做的方法是在每个目录根目录中运行 find 命令,并将输出通过管道传输到单独的文件。然后,您可以使用您选择的 diff 工具对文件进行比较。如果要过滤掉某些目录或文件,可以在管道中输入一些grepgrep -v 命令,也可以尝试find 命令上的选项。

另一个主要选项是找到一个提供目录/文件夹比较的差异工具。大多数商品都支持这一点,但我喜欢命令行方法,因为您可以更好地控制自己的差异。

cd /my/directory/one
find . -print | sort > /temp/one.txt

cd /my/directory/two
find . -print | sort > /temp/two.txt

diff /temp/one.txt /temp/two.txt

【讨论】:

  • 感谢您的意见。是的,我倾向于尽可能简单并且喜欢控件。我也喜欢命令行方法。
  • 您可能想find . -print | sort ...,因为 find 不保证任何特定的输出顺序。
  • 因此,如果我进行 diff 并将其输出到文件并且没有得到任何结果(0 字节),那么我对查看输出不感兴趣。但是,如果有结果并且它大于 0 字节,那么是的,我想查看输出。我将如何构建这种逻辑?如果可以,我可以单行吗?
【解决方案2】:

同时检查inotifywait 命令。它允许您在 RT 中监视文件。

【讨论】:

    【解决方案3】:

    您也可以考虑使用 -newer 开关的 find 命令。

    用法是:

    find . -newer timefile.txt -print
    

    -newer 开关使 find 返回在指定文件的修改时间之后创建或更新的文件列表。在上面的示例中,将返回在 timefile.txt 之后创建或更新的任何文件。您必须创建一个 timefile.txt 文件,很可能每天一次。某些版本的 find 具有较新的变体,可与文件的其他时间戳(上次修改、上次访问、上次创建等)进行比较。

    但是,此技术不会报告已删除的文件。文件列表的每日差异可能会报告这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2010-09-20
      • 2018-11-19
      • 1970-01-01
      • 2012-04-17
      • 2021-10-22
      相关资源
      最近更新 更多