Obtener diferencias entre dos directorios con todos los detalles

Obtener diferencias entre dos directorios con todos los detalles

Tengo dos directorios y necesito que sus diferencias aparezcan en este formato.

ejemplo :

DIR1 conatins :   file1
                  file2
                  file3
DIR2 contains :   file1
                  file4

Salida (solo nombres de archivos, sin contenido de archivos): archivo1 se modifica o es el mismo, se elimina el archivo2, se agrega el archivo4

Respuesta1

Esa es simple, consulte la herramienta popular diff: diff -r dir1 dir2 Editar: entendí mal la pregunta de OP, para obtener solo la informaciónesolos archivos difieren, nocómodifieren, debes usar la -qopción: diff -r -q dir1 dir2

Respuesta2

Emulando cómo herramientas como commo joincompararían dos conjuntos de entradas ordenadas, usando bash:

# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )

# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
        name1=${files1[0]}
        name2=${files2[0]}

        if [[ $name1 == "$name2" ]]; then
                # Name exists in both directories.
                printf '%s is modified or same\n' "$name1"
                files1=( "${files1[@]:1}" )
                files2=( "${files2[@]:1}" )
        elif [[ $name1 < $name2 ]]; then
                # Name exists in only first directory.
                printf '%s is removed\n' "$name1"
                files1=( "${files1[@]:1}" )
        else
                # Name exists in only second directory.
                printf '%s is added\n' "$name2"
                files2=( "${files2[@]:1}" )
        fi
done

# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
        printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
        printf '%s is added\n' "${files2[@]}"
fi

Estoy usando dos bashmatrices para contener los nombres que se encuentran en cada directorio y luego repito hasta que una de estas matrices está vacía.

En el bucle, comparo el nombre de cada matriz entre sí. Si los nombres son los mismos, entonces el archivo es el mismo o posiblemente haya sido modificado (el nombre se elimina de ambas matrices).

Si el nombre de la primera matriz se ordena antes que el nombre de la segunda matriz (probado con <), entonces falta el primer nombre en el segundo directorio. Ahora elimine el primer elemento de la primera matriz.

De lo contrario, el nombre de la segunda matriz falta en el primer directorio. Ahora elimine el primer elemento de la segunda matriz.

Después del ciclo, es posible que una de las matrices aún no esté vacía, por lo tanto, genere los nombres de esa matriz si es necesario.

información relacionada