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?