¿Cómo eliminar directorios de origen vacíos al mover carpetas con rsync?

8

rsyncse puede llevar a carpetas móviles de manera muy similar y superior a la tradicional mvcon las siguientes opciones:

rsync -axvvES --remove-source-files source_directory /destination/

Sin embargo, una cosa que todavía no puedo hacer es eliminar los directorios originales. La --remove-source-filesbandera hace exactamente eso, elimina los archivos de origen, pero no también los directorios de origen. Ojalá hubiera una --remove-source-directoriesbandera también, pero no la hay.

¿Cómo puedo lidiar con esto? Supongo que puedo emitir un mensaje rm -frdespués de la mudanza, sin embargo, preferiría mantener todo el procedimiento en un solo proceso en lugar de introducir posibles errores.

iluminar
fuente
¿Cuál es su razón para no usar mv?
Nils
1
Diferentes volúmenes y necesito preservar todos los atributos, incluidos los tiempos.
iluminar
1
La misma necesidad aquí unix.stackexchange.com/q/78375/3858 .
Alix Axel
1
Estoy muy sorprendido de que rsync no tenga opción para esto, especialmente cuando lo hace en el lado de destino. find . -type d -empty | xargs rmdir -p
Termino
Sabes @ Sridhar-Sarnobat. No puedo evitar preguntarme si hay una manera de pasar los resultados de una rsyncsesión a una lista que luego se procesa siguiendo el proceso que luego lo limpia ... Hmm.
iluminar

Respuestas:

4

No he encontrado un comando que lo haga de una vez, pero dado que rsync aún funciona mejor que rm -rf(especialmente si tiene una gran cantidad de directorios) aquí hay dos comandos rsync que hacen un "movimiento" :

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/ && rmdir source/
Alix Axel
fuente
5

El uso de " rm -rf " tiene una condición de carrera inherente, es decir, puede eliminar los archivos que se acaban de crear entre las invocaciones rsync y rm .

Prefiero usar:

rsync --remove-source-files -a server:incoming/ incoming/ && 
ssh server find incoming -type d -delete

Esto NO eliminará los directorios si no están vacíos.

Raúl Salinas-Monteagudo
fuente
Tenga en cuenta que aparentemente puede necesitar agregar -depthOSX u otros.
Charlie Gorichanaz
3

Terminé en una situación similar. Quería evitarlo rm -rf, sabiendo que rsync no pudo copiar algunos archivos, y no quería perderlos.

Para eliminar simplemente los directorios vacíos, este es el más conveniente (desde sourcedir):

find . -type d -empty -delete
lp_
fuente
Sí, gracias a Dios por -empty, que solo descubrí recientemente y se ha vuelto muy común para mí usar.
Sridhar Sarnobat
2

¿Por qué no solo agregar rm -rf source_directorydespués de su rsync?

rsync -axvvES --remove-source-files source_directory /destination/ && rm -rf source_directory

Cada programa de línea de comandos está (idealmente) hecho para realizar una tarea específica, y depende de usted unir varios para realizar tareas más complejas.

Gregory MOUSSAT
fuente
2
Creo que tienes razón. Creo que, en última instancia, primero tengo que perforar hasta el fondo, ya que no puedo quedar atrapado simplemente moviéndome como lo hace normalmente rsync. Probablemente necesite usar find -depth. ¿Tendría alguna sugerencia en cuanto a un enfoque algorítmico rápido para llegar al final de la pila de directorios, moverse con rsync, correr como se nota y luego retroceder en el árbol?
iluminar