Diff varios files, verdadero si todos no son iguales

Tengo varios files, quiero verificar que todos esos files tengan el mismo contenido.

¿Qué línea de command podría usar para verificar eso?

El uso podría ser algo como:

$ diffseveral file1 file2 file3 file4 

Resultado:

 All files equals 

O

 Files are not all equals 

Con GNU diff, pase uno de los files como un argumento para --from-file y cualquier cantidad de otros como operando:

 $ diff -q --from-file file1 file2 file3 file4; echo $? 0 $ echo >>file3 $ diff -q --from-file file1 file2 file3 file4; echo $? Files file1 and file3 differ 1 

Qué tal si:

 md5sum * | awk 'BEGIN{rc=1}NR>1&&$1!=last{rc=0}{last=$1}END{exit rc}' 

Calcula el valor de MD5 para cada file, luego compara cada input con la siguiente, si hay alguna diferente, luego devuelve un estado de salida cero (verdadero). Esto sería mucho más corto si devuelve falso si es diferente:

 md5sum * | awk 'NR>1&&$1!=last{exit 1}{last=$1}' 

No es necesario orderar, ya que solo estamos comprobando si alguno es diferente.

El siguiente código debería ser bastante auto explicativo. $# es el número de arguments de file, y shift solo los consume de a uno por vez. Utiliza cmp -s -s para una comparación silenciosa byte-wise.

 #!/bin/sh # diffseveral if [ $# -lt 2 ]; then printf '%s\n' "Usage: $0 file1 file2 [files ...]" >&2 exit 2 fi oldfile="$1" shift while [ $# -gt 0 ]; do newfile="$1" if ! cmp -s "$oldfile" "$newfile"; then echo 'Files differ.' exit 1; fi shift done echo 'All files identical.' exit 0 

Solo puedes diff dos a la vez, pero es bastante fácil verificar si son iguales:

 if diff file1 file2 && diff file2 file3 && diff file3 file4; then echo All equal else echo Not fi 

Si tiene suficiente para justificar un bucle, use algo como esto:

 alleq () { for file; do diff -q "$1" "$file" >/dev/null || return 1 done } if alleq file1 file2 ...; then echo All equal else echo Not fi