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:
rsync
sería una mala elección porque realiza una gran cantidad de trabajo en segundo plano cliente / servidor que representa los sistemas locales y remotos.mv
Es probablemente la mejor opción. Si es posible, deberías intentarlo enmv directory_old directory_new
lugar de hacerlomv directory_old/* directory_new/
. De esta manera, mueves una cosa en lugar de un millón de cosas.fuente
mv
si estamos hablando de millones.mv
solo actualiza la información del inodo para quemv directory_old directory_new
funcione más rápido quemv directory_old/* directory_new
find -print0
con lexargs -0
permite usar espacios en los nombres.xargs -r
no se ejecutará amv
menos que haya algo que mover. (mv
se quejará si no se proporcionan archivos de origen).mv -t
permite 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
mv
en el DIRECTORIO y no en el contenido del directorio.Si residen en dos sistemas de archivos diferentes, use rsync:
rsync -av /source/directory/ /destination
Observe 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/destination
rsync
mantendrá la propiedad del archivo si lo ejecuta como root o si los archivos son de su propiedad. También mantendrá elmtime
de cada archivo individual.fuente
rsync
parece 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 x
obtienes 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 -l
lugar demv
como una opción.cp -l
creará 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 (
cp
orsync
, 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
PWD
es/
ahora. y/a
contiene los millones de imágenes. Nuestra tarea es mover todas las imágenes a/b
, manteniendo toda la estructura del subdirectorio. Supongamos también/a
y/b
son 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
,tmux
o bien ejecutar esto como un proceso de fondo.Eso sería copiar todos los archivos y directorios en los
/a
que/b
, por lo que ahora tendrá que limpiar/a
una vez que confirme que ha completado sin error.fuente