Tengo un millón de imágenes que ocupan 30 GB de espacio en disco que deben moverse de un directorio local a otro directorio local.
¿Cuál sería la forma más eficiente de hacer esto? Utilizando mv? Utilizando cp? Utilizando rsync? ¿Algo más?
Necesito tomar estos:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
y moverlos aquí:
/path/to/new/img/dir/

mv, en términos de rendimiento, si los directorios de origen y destino residen en el mismo sistema de archivos.Respuestas:
rsyncsería una mala elección porque realiza una gran cantidad de trabajo en segundo plano cliente / servidor que representa los sistemas locales y remotos.mvEs probablemente la mejor opción. Si es posible, deberías intentarlo enmv directory_old directory_newlugar de hacerlomv directory_old/* directory_new/. De esta manera, mueves una cosa en lugar de un millón de cosas.fuente
mvsi estamos hablando de millones.mvsolo actualiza la información del inodo para quemv directory_old directory_newfuncione más rápido quemv directory_old/* directory_newfind -print0con lexargs -0permite usar espacios en los nombres.xargs -rno se ejecutará amvmenos que haya algo que mover. (mvse quejará si no se proporcionan archivos de origen).mv -tpermite especificar primero el destino y luego los archivos de origen que necesitaxargs.Por cierto, me preguntaría si realmente tengo que mover una gran cantidad de archivos a la vez. El procesamiento por lotes está sobrevalorado. Intento no acumular grandes cantidades de trabajo si puedo procesar las cosas en el momento en que se generan.
fuente
Si los dos directorios residen en el mismo sistema de archivos, utilícelos
mven el DIRECTORIO y no en el contenido del directorio.Si residen en dos sistemas de archivos diferentes, use rsync:
rsync -av /source/directory/ /destinationObserve el seguimiento
/en la fuente. Esto significa que copiará el CONTENIDO del directorio y no el directorio en sí. Si deja la opción/desactivada, seguirá copiando los archivos, pero se ubicarán en un directorio llamado/destination/directory. Con el /, los archivos solo estarán en/destinationrsyncmantendrá la propiedad del archivo si lo ejecuta como root o si los archivos son de su propiedad. También mantendrá elmtimede cada archivo individual.fuente
rsyncparece correr círculosmv. ¡Gracias por el consejo!Cuando usa 'cp', cada archivo abre, lee, cierra, abre, escribe y cierra. Tar utiliza diferentes procesos para leer y escribir, así como múltiples pasos para operar en múltiples archivos a la vez. Incluso en una sola caja de CPU, las aplicaciones multiproceso son más rápidas.
fuente
tar c | tar xobtienes un costo de O (tamaño_total) en lugar de O (cuenta_archivos).Como ambos, directorio_vejez y directorio_nuevo están en el mismo sistema de archivos que podría usar en
cp -llugar demvcomo una opción.cp -lcreará enlaces duros a los archivos originales. Cuando haya terminado con 'mover' y esté satisfecho con el resultado, puede eliminar estos archivos de directory_old. en términos de velocidad, será el mismo que 'mv', ya que primero crea los enlaces y luego elimina los originales. Pero este enfoque le permite comenzar desde el principio si esto tiene sentidofuente
Depende (tm). Si su sistema de archivos es copia-en-escritura, entonces copiar (
cporsync, por ejemplo) debería ser comparable a un movimiento. Pero para los casos más comunes, move (mv) será el más rápido, ya que simplemente puede cambiar los datos que describen dónde se ubica un archivo (nota: esto está demasiado simplificado).Entonces, en su instalación promedio de Linux, iría por
mv.EDITAR: @ Frédéric Hamidi tiene un buen punto en los comentarios: esto solo es válido si ambos están en el mismo sistema de archivos y disco. De lo contrario, los datos se copiarán de todos modos.
fuente
Para copiar al menos ~ 10k de archivos (sin directorios), cp se quejó con:
La mejor opción es Rsync:
¡Y se hizo muy rápido!
fuente
Si tiene espacio libre, archívelos en un único archivo .tar (sin compresión es más rápido) y luego mueva ese archivo y desarchívelo.
fuente
La naturaleza del destino determinaría la forma más eficiente de realizar esta tarea. Supongamos que está en un sistema local, su
PWDes/ahora. y/acontiene los millones de imágenes. Nuestra tarea es mover todas las imágenes a/b, manteniendo toda la estructura del subdirectorio. Supongamos también/ay/bson puntos de montaje para dos particiones diferentes, cada una en un disco conectado localmente. Queremos hacer esta tarea con una lona. Esto puede llevar algún tiempo, así que asegúrese de que está utilizandoscreen,tmuxo bien ejecutar esto como un proceso de fondo.Eso sería copiar todos los archivos y directorios en los
/aque/b, por lo que ahora tendrá que limpiar/auna vez que confirme que ha completado sin error.fuente