macos – Diferenciar entre dos directorios y mantener solo los que no han cambiado

Pregunta:

Necesito diferenciar dos directorios:

 A: /path1/
 B: /path2/
  1. El directorio A contiene todos los archivos y subdirectorios que también están contenidos en B.
  2. Los archivos en A (y en sus subdirectorios) pueden tener diferentes contenidos de los archivos equivalentes en B.
  3. 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 {} \; ejecuta rmdir -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.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Ir arriba