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
.