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 -q
opción:
diff -r -q dir1 dir2
Respuesta2
Emulando cómo herramientas como comm
o join
compararí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 bash
matrices 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.