Encuentra todas las carpetas en un directorio con el mismo contenido

10

En Ubuntu, ¿hay alguna para encontrar carpetas duplicadas en un directorio (es decir, carpetas con el mismo contenido)? Creo que ya hay algunas herramientas de línea de comandos disponibles para encontrar archivos duplicados (como fdupes), pero en su lugar quiero encontrar carpetas duplicadas. Es decir, busque carpetas que coincidan en términos del contenido de los archivos que contienen (aunque los nombres de archivo y otros metadatos pueden diferir).

Anderson Green
fuente
Podría comenzar generando una lista de todas las carpetas en un directorio (ordenadas por longitud), y luego verificar cada par de carpetas con la misma longitud.
Anderson Green
Definir "duplicado". ¿Deben coincidir los archivos dentro del contenido del archivo? ¿Nombre del archivo? Número de inodo? ¿Tamaño del archivo?
Chris Down
@ChrisDown La pregunta ha sido actualizada.
Anderson Green
3
Si. Los directorios son realmente solo archivos, por lo que su declaración es ambigua. Tener el "mismo contenido" en realidad significaría que ambos directorios contienen las mismas referencias de inodo. No está claro si quiere decir eso, o si quiere decir que los archivos dentro deben tener el mismo contenido, y si es así, si hay otras estipulaciones (mtime, nombre de archivo, etc.).
Chris Down
3
@ChrisDown Quiero decir que los archivos dentro deben tener el mismo contenido.
Anderson Green

Respuestas:

5
#!/bin/bash
shopt -s dotglob

for file in "$1"/*; do [[ -f "$file" ]] && d1+=( "$(md5sum < "$file")" ); done
for file in "$2"/*; do [[ -f "$file" ]] && d2+=( "$(md5sum < "$file")" ); done 

[[ "$(sort <<< "${d1[*]}")" == "$(sort <<< "${d2[*]}")" ]] && echo "Same" || echo "Different"

Puedes verlo en acción aqui:

$ mkdir 1 2
$ ./comparedirs 1 2
Same
$ cat > 1/1 <<< foo
$ cat > 2/1 <<< foo
$ ./comparedirs 1 2
Same
$ cat > 2/1 <<< bar
$ ./comparedirs 1 2
Different
Chris Down
fuente
Dado que este script no ha sido probado, estoy ansioso por ver si funciona de la forma en que se supone que debe funcionar.
Anderson Green
1
@AndersonGreen Comprueba la respuesta actualizada, la probé.
Chris Down
¡Agradable! También debería haber una prueba con cat > 1/2 <<< bary cat > 2/3 <<< bar para mostrar múltiples archivos y metadatos diferentes (== "Mismo")
nealmcb
@ChrisDown: ¿se necesita ordenar en el último paso?
harish.venkat
Script elegante, el único error menor es que devuelve el mismo cuando uno o ambos directorios no existen. Debe ser fácil solución si uno es mejor en secuencias de comandos que yo
coseno