Recientemente necesitaba eliminar una gran cantidad de archivos (más de 1 millón) y lo leí haciendo:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Fue una de las formas más optimizadas para hacer eso, y puedo garantizar que es más rápido que rm -rf
.
No soy un experto en el tema, pero, según tengo entendido, el motivo del rendimiento de rsync tiene algo que ver con la forma en que enumera los archivos (LIFO en lugar de FIFO, supongo). Ahora, el problema es que también necesito mover una gran cantidad de archivos de manera eficiente. Después de buscar un poco, encontré esto:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Si bien esto elimina todos los movido los archivos en ~/source
los directorios permanecen allí. Como tengo una estructura de directorio tipo "round-robin", el número de files/directories
es muy cercano a 1, por lo que me veo obligado a ejecutar el primer comando nuevamente para deshacerme completamente del directorio:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Una recta mv
terminaría prácticamente al instante, pero mi ~/destination
directorio tiene archivos que deben mantenerse, por mv
lo que no es una opción. Encontré las opciones --prune-empty-dirs
y --force
rsync, pero ninguna parece funcionar como lo esperaría:
--force force deletion of directories even if not empty
--prune-empty-dirs prune empty directory chains from the file-list
--remove-source-files sender removes synchronized files (non-dirs)
¿Hay alguna manera de imitar un movimiento con rsync de una vez?
Respuestas:
Encontré este hilo en stackoverflow titulado: ¿ Eliminar carpetas con rsync "move"? , que hace esencialmente la misma pregunta. Una de las respuestas sugirió hacer los
rsync
comandos in 2 ya que parece que no hay un solo comando que pueda realizar el movimiento / eliminación de los archivos y los directorios de origen.Alternativamente, puede hacerlo usando este comando:
No es ideal pero hace el trabajo.
fuente
rsync
para podar directorios no se siente bien y siempre hay peligro con esorm -rf
. Recomiendo que el segundo paso sea:find source/ -d -type d -exec rmdir {} \;
-delete
y--remove-source-files
en un solo comando rsync (los ejemplos anteriores están bien, esto es tangencial). Si interrumpe y luego vuelve a ejecutar lo que estoy describiendo, perderá los archivos transferidos. Lo que he hecho antes :(find
, prefiero esto:find source/ -type d -empty -delete
me da una extraña sensación de tranquilidad de que no solo golpeará todo.Desde el comentario de zany hasta la respuesta de slm (¿ Mover archivos y eliminar directorios con rsync? ) Recomendaría estos 2 comandos como respuesta:
La ventaja es que, como dijo Zany, todavía hay algún peligro al usar rm -rf si no lo haces bien o para principiantes.
Agregué 2 opciones, -depth y -empty, y aunque no estoy seguro de si esto es realmente necesario, hace que el segundo comando sea más portátil para otras situaciones y aún más seguro (todavía hace lo correcto si algunos directorios no están vacíos y comienza a eliminar desde el punto más profundo en un árbol de directorios)
fuente
-delete
lugar de-exec rmdir {} \;
?Esto hace el trabajo en un solo paso. Tenga en cuenta el trailing / slash / en las rutas de origen y destino.
Me hago eco de la advertencia de user7000 de no usar
--delete
y--remove-source-files
juntos en la misma llamada arsync
. Si la operación falla o se interrumpe y se repite la misma llamada, perderá datos. Si tiene alguna duda, use la--dry-run
opción para ver qué se haría.fuente
-ruval
Parece redundante.-a
es equivalente a-rlptgoD
, que incluye ambos-r
y-l
.