Pregunta:
Necesito diferenciar dos directorios:
A: /path1/
B: /path2/
- El directorio A contiene todos los archivos y subdirectorios que también están contenidos en B.
- Los archivos en A (y en sus subdirectorios) pueden tener diferentes contenidos de los archivos equivalentes en B.
- El directorio A (y sus subdirectorios) también tiene archivos adicionales que no existen en B.
Lo que me gustaría lograr es:
- Mantenga solo los archivos en A que difieran de los archivos en B más todos los archivos adicionales que no existen en B.
- Elimine todos los demás archivos en A que no respeten la regla anterior.
Respuesta:
Este enfoque debería funcionar:
cd /path1
find . -type f -exec cmp -s {} /path2/{} \; -delete
Cómo funciona:
-
find . -type f
recorre todos los archivos del directorio actual ( A ) y sus subdirectorios. -
cmp -s {} /path2/{}
silenciosamente (-s
) compara el archivo actualmente procesado ({}
) con el archivo coincidente en B (/path2/{}
). -
Si los archivos son idénticos, cmp devuelve verdadero y la condición
-exec
coincide. -
Si la condición
-exec
coincide,-delete
elimina el archivo.
Sugiero reemplazar -delete
con -print
antes de ejecutar el comando real para verificar si funciona como se esperaba.
Para lidiar con los directorios vacíos sobrantes, puede ejecutar el comando:
find . -type d -exec rmdir -p {} \; 2> /dev/null
-
-type d
solo busca directorios. -
-exec rmdir -p {} \;
ejecutarmdir -p {}
para cada directorio que se ha encontrado.{}
es el directorio que se ha encontrado, y la opción-p
hace que rmdir elimine también sus directorios padre vacíos. -
2> /dev/null
suprime los mensajes de error que surgirán al intentar eliminar directorios no vacíos o eliminados previamente.
Dado que rmdir no puede eliminar directorios que no estén vacíos, esta debería ser la forma más segura.