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
在第一个目录中,我可能有添加了行的文件,然后这些文件会转到第二个目录。在此示例中,我可能需要file3
在sub2
.
如何获取有差异的文件列表?
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
。