comando uniq no funciona correctamente?

22

Así que estoy revisando el md5hash de mis archivos con esto como mi salida:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
657cf4512a77bf47c39a0482be8e41e0  ./dupes.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

Sin embargo, después de correr find . -type f -exec md5sum '{}' ';' | uniq -w 33para encontrar los hashes únicos, obtengo esto:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

Según tengo entendido, solo uno de uno derpina.txto derp.txtdebería aparecer ya que sus hashes son los mismos. ¿Me estoy perdiendo de algo? ¿Alguien puede aclararme por qué sale así?

user2127726
fuente
1
Lo averigué. Aparentemente, uniq no detecta líneas repetidas a menos que sean adyacentes. Enlace a la respuesta que me ayudó a stackoverflow.com/questions/23114677/…
user2127726

Respuestas:

49

Necesitas usar sortantes uniq:

find . -type f -exec md5sum {} ';' | sort | uniq -w 33

uniqsolo elimina líneas repetidas. No reordena las líneas buscando repeticiones. sorthace esa parte

Esto está documentado en man uniq:

Nota: 'uniq' no detecta líneas repetidas a menos que sean adyacentes. Es posible que desee ordenar la entrada primero o usar sort -u' withoutuniq '.

John1024
fuente
uniqdebe tener un alias como sort -upredeterminado en todos los sistemas. Si es que siempre necesita "ordenar" para que funcione correctamente.
Devaroop
Ese cambio disminuiría cierta confusión. Por otro lado, uniqtiene muchas características que no están disponibles con sort -u. Además, hay casos en los que uno quiere usar uniqsin él sort.
John1024
5

La entrada para uniqnecesita ser ordenada. Entonces, para el caso de ejemplo,

find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33

trabajaría. El -w( --check-chars=N) hace que las líneas sean únicas solo con respecto a la primera columna; Esta opción funciona para este caso. pero las posibilidades para especificar las partes relevantes de la línea uniqson limitadas. Por ejemplo, no hay opciones para especificar el trabajo en algunas columnas 3 y 5, ignorando la columna 4.

El comando sorttiene una opción para líneas de salida únicas en sí, y las líneas son únicas con respecto a las teclas utilizadas para la ordenación. Esto significa que podemos hacer uso de la poderosa sintaxis clave de sortdefinir con respecto a qué parte las líneas deben ser uniq.

Por el ejemplo,

find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u

da el mismo resultado, pero la sortpieza es más flexible para otros usos.

Volker Siegel
fuente