使用文件列表对文本文件进行 diff 来按大小和/或修改日期/时间查找不同的文件

使用文件列表对文本文件进行 diff 来按大小和/或修改日期/时间查找不同的文件

我需要比较两个文件夹来查找以下文件:

  • 不同的大小和/或修改的日期/时间
  • 缺少一个

在我的情形下,我无法diff对这两个文件夹运行。我的计划是使用find这两个文件夹并将输出保存到两个文本文件,然后使用 比较这两个文本文件diff

我认为这会起作用但需要确定,因为我的源/目标目录很大,如果我的测试没有显示差异,或者没有找到所有差异,我就无法知道它是否起作用。

如果两个文件夹完全相同,我认为它会起作用。但我怀疑如果一个文件夹有很多更复杂的子目录/文件会发生什么。能够diff理解文件夹结构的打印输出吗?

比如说,我会在某一天对文件夹进行一次盘点。

$ find /path/to/folder -exec ls -ld {} \; > inventory-20181101.txt
...

我会修改很多东西,包括添加、删除、编辑文件以及添加或删除文件夹和子文件夹。然后另一天我会再做一次盘点。

$ find /path/to/folder -exec ls -ld {} \; > inventory-20181102.txt
...

然后我将比较这两个文件的差异。

$ diff inventory-20181101.txt inventory-20181102.txt

我认为如果没有更改或更改很小(例如仅修改文件),这种方法会有效。但是,如果我添加 5 层嵌套文件夹,然后在其中添加 100 个文件,并删除另一个顶级文件夹,会发生什么情况。能够diff匹配正确的文件夹吗?

答案1

为了获得可靠的概览,您需要两个目录中文件的统一且可排序的列表,以及比较这两个列表的方法。

正如已经指出的那样,diff旨在创建可读、语义合理的文件间差异概述。这使得它非常适合比较纯文本或代码,但不太适合比较列表。
相反,它用于comm查找两个列表之间的共同点或差异。

要生成仅包含所需信息的“干净”列表,请使用-printfGNU 提供的选项find。它比ls为每个文件生成一个进程更高效、更强大,并且可以直接输出有用的信息,例如:

  • %Tk File's last modification time in the format specified by k
  • %s File's size in bytes
  • %p File's name

综合起来:

  1. 列出每个目录中的文件(以仅包含所需信息的格式)→find … -printf …
  2. 对列表进行排序 →sort
  3. 查找所有不是列表之间相同 → comm -3:“抑制第 3 列(两个文件中都出现的行)”
 cd dir1 && find . -printf '%T+ %s %p\n' | sort > ../dir1.txt && cd ..
 cd dir2 && find . -printf '%T+ %s %p\n' | sort > ../dir2.txt && cd ..
 comm -3 dir1.txt dir2.txt > differences.txt

需要注意的是%T+:日期格式将包含秒的小数部分 (2018-11-25+14:58:43.1197033990)。如果您的两个目录存储在具有不同日期精度的不同文件系统上,则可能必须使用不同的(手动)日期格式来排除秒的小数部分。

相关内容