¿Cómo encontrar files con el mismo nombre pero diferente número de líneas en dos directorys?

Tengo un directory sub1 con los siguientes files:

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

En sub2 , tengo lo siguiente:

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

En el primer directory, puedo tener files con líneas adicionales, que luego van al segundo directory. En este ejemplo, podría necesitar actualizar el file3 en sub2 .

¿Cómo obtengo una list de los files con diferencias?


Hice algunas testings con diff y grep , pero no funciona porque los directorys tienen diferentes files (y por lo tanto las líneas son diferentes):

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

Idealmente, obtendría una list como esta:

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

¡Cualquier ayuda es apreciada!


Notas:

  • No puedo verificar la date porque todos los files fueron actualizados, con o sin cambios.

  • A veces los files más recientes carecen de algunas líneas, por lo que no puedo tomar el más grande.

Aquí hay una shell rápida y sucia "one-liner" con salida de ejemplo:

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

La línea total es un artefacto de la salida de wc . Se puede eliminar con otro filter:

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

Explicación:

join unirá dos files basados ​​en una columna común. En este caso, nos uniremos en base a la segunda columna ( -j2 ). En la salida de wc la segunda columna es el nombre del file. Esto solo imprimirá files que son comunes en ambos directorys.

Las invocaciones de wc se realizan en sustituciones de processs con el directory de trabajo cambiado a sub1 o sub2 para que los nombres de file se impriman sin el nombre del directory. Esto es para que join pueda encontrar los files comunes.

El command awk compara el valor en la segunda y tercera columna y solo imprime la línea si los valores son diferentes. Esto filtrará los files con el mismo número de líneas.

head -n-1 imprimirá todas las líneas pero no la última línea. Esto filtrará la última línea total de wc .