如何在两个目录中查找具有相同名称但行数不同的文件?

如何在两个目录中查找具有相同名称但行数不同的文件?

sub1我有一个包含以下文件的目录:

$ wc -l *

5 file1.csv
5 file3.csv
1 file4.csv

在 中sub2,我有以下内容:

$ wc -l *
5 file1.csv
5 file2.csv
1 file3.csv
5 file4.csv
1 file5.csv

在第一个目录中,我可能有添加了行的文件,然后这些文件会转到第二个目录。在此示例中,我可能需要file3sub2.

如何获取有差异的文件列表?


diff我用and做了一些测试grep,但它不起作用,因为目录有不同的文件(因此行是不同的):

~/dir1/$ wc -l >> wc.luis

~/dir1/$ wc -l * | awk '{ gsub(/\/home.*dir1\//,""); print $0 }' 
                 | diff --side-by-side wc.luis -
                 | grep \|

理想情况下,我会得到这样的列表:

5 file3.csv | 1 file3.csv
1 file4.csv | 5 file4.csv

任何帮助表示赞赏!


笔记:

  • 我无法检查日期,因为所有文件都已更新,无论有没有更改。

  • 有时是最新的文件缺少有些线路,因此我不能只选择较大的线路。

答案1

这是一个快速而肮脏的 shell“one-liner”,带有示例输出:

$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3'
file3.csv 5 1
file4.csv 1 5
total 11 17

total行是 的输出的产物wc。可以用另一个过滤器将其删除:

$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3' | head -n-1
file3.csv 5 1
file4.csv 1 5

解释:

join将基于公共列连接两个文件。在本例中,我们根据第二列 ( -j2) 进行连接。wc第二列的输出是文件名。这只会打印两个目录中共有的文件。

调用wc是在流程替代工作目录更改为sub1左右,sub2因此打印的文件名不带目录名。这样就join可以找到常见的文件。

awk命令比较第二列和第三列中的值,并且仅在值不同时才打印该行。这将过滤掉具有相同行数的文件。

head -n-1将打印所有行但不打印最后一行。这将从total中过滤掉最后一行wc

相关内容