Aqui está um "one-liner" de shell rápido e sujo com saída de exemplo:
$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3'
file3.csv 5 1
file4.csv 1 5
total 11 17
A linha total é um artefato da saída de wc . Pode ser removido com outro filtro:
$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3' | head -n-1
file3.csv 5 1
file4.csv 1 5
Explicação:
join unirá dois arquivos com base em uma coluna comum. Neste caso nós nos juntamos com base na segunda coluna ( -j2 ). Na saída de wc , a segunda coluna é o nome do arquivo. Isso só imprimirá arquivos comuns em ambos os diretórios.
As invocações de wc são feitas em substituições de processos com o diretório de trabalho alterado para sub1 ou sub2 para que os nomes dos arquivos sejam impressos sem o nome do diretório. Isso é para que join possa encontrar os arquivos comuns.
O comando awk compara o valor na segunda e terceira coluna e imprime apenas a linha se os valores forem diferentes. Isso filtrará os arquivos com a mesma contagem de linhas.
head -n-1 imprime todas as linhas, mas não a última linha. Isso filtrará a última linha total de wc .