我需要比较两个文件夹来查找以下文件:
- 不同的大小和/或修改的日期/时间
- 缺少一个
在我的情形下,我无法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
查找两个列表之间的共同点或差异。
要生成仅包含所需信息的“干净”列表,请使用-printf
GNU 提供的选项find
。它比ls
为每个文件生成一个进程更高效、更强大,并且可以直接输出有用的信息,例如:
%Tk File's last modification time in the format specified by k
%s File's size in bytes
%p File's name
综合起来:
- 列出每个目录中的文件(以仅包含所需信息的格式)→
find … -printf …
- 对列表进行排序 →
sort
- 查找所有不是列表之间相同 →
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)。如果您的两个目录存储在具有不同日期精度的不同文件系统上,则可能必须使用不同的(手动)日期格式来排除秒的小数部分。