Usar rsync para eliminar solo archivos extraños

13

¿Cuál es la mejor manera de comparar dos estructuras de directorios y eliminar archivos y directorios extraños en la ubicación de destino?

Tengo una pequeña aplicación web de galería de fotos que estoy desarrollando. Los usuarios agregan y eliminan imágenes usando FTP. El software de la galería web que he escrito crea nuevas miniaturas sobre la marcha, pero no se ocupa de las eliminaciones. Lo que me gustaría hacer es programar una secuencia de comandos / bash para que se encargue de esto a intervalos predefinidos.

Las imágenes originales se almacenan /home/gallery/images/y se organizan en álbumes, utilizando subdirectorios. Las miniaturas se almacenan en caché /home/gallery/thumbs/, utilizando la misma estructura de directorio y nombres de archivo que el directorio de imágenes.

He intentado usar lo siguiente para lograr esto:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

lo que funcionaría bien si todas las miniaturas ya se han almacenado en caché, pero no hay garantía de que este sea el caso, cuando esto suceda, el directorio del pulgar tiene imágenes originales de tamaño completo copiadas.

¿Cómo puedo lograr lo que intento hacer?

Bryan
fuente

Respuestas:

8

No creo que rsyncsea ​​el mejor enfoque para esto. Usaría un bash one-liner como el siguiente:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

Si esta línea produce la lista correcta de archivos, puede modificarla para ejecutar un rmcomando en lugar de un echocomando.

Tom Shaw
fuente
Gracias Tom. Supongo que también para limpiar los directorios, tendría que ejecutarlo por segunda vez, pero especificando directorios en los comandos en lugar de archivos, y sustituyendo el eco con rmdir?
Bryan
@Bryan: Sí, eso suena razonable. Tendría que cambiar las banderas en findy en la [prueba ]. Por supuesto, tenga mucho cuidado tanto con el comando que le he dado como con cualquier modificación, y pruebe a fondo con echo!
Tom Shaw
Muchas gracias, aplicaré grandes cantidades de eco durante las pruebas.
Bryan
1
Solo pensé: podría probar con "ls" también para asegurarse de que funciona bien con espacios en blanco. Los mejores deseos.
Tom Shaw
34

--existingtambién necesitas :

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

Desde la página del manual:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).
Joril
fuente
1
Si hay algún error, su increíble respuesta no funcionará. Es por eso que también necesita agregar el --ignore-errorsargumento también. Eso es lo único que funcionó para mí. Gracias por --existingy --ignore-existing! Usé tu respuesta como la base de mi respuesta aquí .
LonnieBest
@LonnieBest Si hay errores, ni siquiera rm, cpo mvfuncionará como eso es lo que los errores son: Son problemas que deben mirarse y que impiden las operaciones de completar con éxito. Puede indicar a la mayoría de las herramientas que ignoren los errores (por ejemplo, -fpara rm), pero no veo cómo eso es relevante para la pregunta o esta respuesta.
Mecki