Mover gran cantidad de archivos (~ 100 000)

13

Trabajo con carpetas que contienen muchos archivos, como 100 000 o incluso 1 000 000 de archivos por carpeta. Cuando trato de mover el contenido de una carpeta a otra, mi computadora siempre se atasca. Incluso cuando el proceso parece finalizado, no puedo ver el contenido de ninguna carpeta porque nautilus parece completamente congelado y tengo que forzar a mi computadora a reiniciarse. Noté que esto sucede también cuando intento moverme como 10 000 archivos.

¿Es un problema de mi computadora o es normal cuando trabajo con estos números?

¿Alguna forma inteligente de realizar esta transferencia de archivos?

Hyperion
fuente
3
¿Qué pasa con el uso de la terminal ( cp -R SRC/ DEST/)
UniversallyUniqueID
2
@BharadwajRaju: Dependiendo de los archivos, cp -a podría ser mejor porque conserva los propietarios, las marcas de tiempo y los permisos. También recomendaría rsync porque puede verificar transferencias y solo copia archivos que aún no existen.
Michael
Actualización: gvfs-copy(desde el gvfs-binpaquete) puede ser más rápido que cp.
UniversallyUniqueID
Tienes dos preguntas aquí en lugar de una. Consulte la página Cómo preguntar para obtener instrucciones.
Luís de Sousa

Respuestas:

19

Quizás considere usar un método de línea de comando puro para transferir archivos de grandes cantidades, sin duda encontrará que el proceso es sustancialmente más rápido que usar una interfaz gráfica de usuario.

Hay muchas maneras diferentes de lograr esto, pero las siguientes funcionaron de manera rápida, segura y eficiente en mi sistema:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Alguna explicación para este comando:

  1. Su directorio de entrada es el '.' carácter y para este comando en particular necesita estar en ese directorio
  2. Su directorio de salida es el <destination>en mi ejemplo. Obviamente modifique esto para satisfacer sus propias necesidades y omita los corchetes.
  3. Esta sintaxis permite nombres de archivo con espacios como bonificación :)

Son posibles permutaciones infinitas, pero esto debería funcionar bien y de manera mucho más eficiente que la interfaz gráfica de usuario. Una permutación, por ejemplo: si desea mover solo archivos PDF, puede ejecutar:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

El uso de xargsabre muchas posibilidades, particularmente con el movimiento de una cantidad tan grande de archivos. Muchas, muchas posibilidades ...

Problemas potenciales:

Hay al menos 2 posibles dificultades para reflexionar, gracias a los comentaristas a continuación por estos pensamientos:

  1. ¡Su directorio de destino podría estar dañado, en una ubicación inaccesible posteriormente, mal escrito, etc. mvaún moverá los archivos allí! Ten cuidado aquí ...
  2. Si falta la -topción ( --target-directory) y la carpeta de destino es en realidad un archivo, moverá un archivo y fallará en el resto. mvtiene 2 usos: cambiar el nombre de la fuente al destino o movimiento fuente de directorio . Nuevamente ten cuidado ...
andrew.46
fuente
2
¿No lo find . -maxdepth 1 -type f -exec mv -t test {} +haría solo ?
muru
@muru: Gracias por eso, me he recortado a una -name...pieza extraña pero me he quedado xargsen su lugar.
andrew.46
2
No lo sé ... Si bien el comando es obviamente correcto tal como está, consideraría que un movimiento completo es demasiado propenso a errores. (¿Qué sucede si, por ejemplo, olvida incluir la -tbandera? Creo que todos los archivos se "moverán" a un solo archivo llamado test, lo que provocará la pérdida de todos sus archivos excepto uno). Creo que preferiría un rsyncseguido por, si todo ha salido bien, a rm. Sin embargo, puedo imaginar escenarios en los que dicha verificación no puede automatizarse.
Jos
@Jos: Gracias, he agregado una nota al pie de página que describe esta posibilidad. Es bueno ver un rsync ejemplo escrito como respuesta?
andrew.46
Linux admite listas de argumentos extremadamente largas, por lo que probablemente pueda hacerlo mv dir1/* dir2, y solo recurra find -execsi hay un problema o si necesita evitar hacer coincidir las carpetas con su glob. (Aunque dependiendo de sus convenciones de nomenclatura, a menudo *.*coincidirá con la mayoría de los archivos, pero no con la mayoría de los directorios, ya que es común tener un .extensionarchivo on y no tener .nombres en el directorio)
Peter Cordes
4

Tuve una experiencia similar antes, es normal cuando se trata de una gran cantidad de archivos. Estaba teniendo una gran colección de hojas de datos PDF (partes electrónicas).

Las herramientas de la GUI verifican algunos detalles del archivo y metadatos (icono / miniatura, tamaño, ...), será un gran problema en tal caso. Incluso en la Vista de iconos y sin miniaturas, se congelarán, ya que la mayoría de ellos no están diseñados para casos tan extremos. La herramienta GUI intenta cargar íconos de presentación para todos los archivos / carpetas en el directorio, incluso esos elementos no son visibles para el usuario en la parte de la pantalla actual. La clasificación también es parte del problema y no hay forma de evitarlo.

  • Termino dividiendo archivos en carpetas separadas según la marca / modelo menos de 10000 cada una. Puede ser que pueda usar la fecha (como lo hace la mayoría de las personas con fotos / escaneos) o las primeras letras (como en el repositorio de paquetes de Ubuntu )
  • En su lugar, es más fácil usar las herramientas de la CLI, ya que solo muestran lo que ha solicitado. Puede utilizar locatepara una búsqueda rápida en lugar de find.
  • Para la operación de movimiento, úsela mven la terminal (las herramientas de la GUI son lentas porque intentan actualizar la vista periódicamente).

    Si está en la misma partición, el comando cambiará solo los punteros en el índice del sistema de archivos. De lo contrario, será una operación dual (copiar y eliminar). Eso será costoso.

Solo hay un caso en el que puedo ayudar, si está copiando esos archivos varias veces y no se actualizan. Como hice cuando comparto mi colección con amigos, cada vez que intento copiarla lleva una década. (Esto es más útil solo con archivos de tamaño pequeño)

  • Cree un solo paquete o algunos paquetes, como zip sin compresión / baja compresión. Cuando lo copie, será más rápido, así que deje que DMA haga su trabajo.
user.dz
fuente
3

Si está buscando una solución que le brinde los beneficios de las operaciones de línea de comandos con la sensación de GUI y la flexibilidad combinadas, le recomiendo mc( comandante de medianoche ).

mc commander vista de 2 paneles

Es un administrador de archivos visual basado en ncurses: tiene una vista de dos paneles en sus archivos y un menú disponible. El uso del mouse es posible, incluso sobre ssh. Puede navegar por su fs, inspeccionar archivos con el visor de archivos, filtrar según los criterios sobre la marcha y realizar las operaciones de copiar o mover en la línea de comandos.

Es un clon del programa Norton commander de DOS que era popular a mediados de los años ochenta. Funciona bien cada vez que la GUI comienza a ser poco confiable para mí e ideal para su propósito.

emk2203
fuente
0

He encontrado problemas algo similares: estaba probando mi configuración RAID y cuando hacía grandes transferencias (por ejemplo, más de 100,000 archivos y 1-2 TB de datos de una sola vez) parece que las transferencias comienzan bastante rápido, digamos ~ 200MB / seg, luego disminuya la velocidad rápidamente a una meseta razonable ~ 90-120MB / seg (posiblemente después de consumir algo de almacenamiento en caché flash en las unidades). Luego, después de 20-30 minutos, la operación comienza a caer gradualmente a una meseta mucho más baja ~ 30-40 MB / seg, peor cuando se trata de archivos pequeños, lo que lleva una operación de 4-5 horas más cerca de 15 horas.

Pasé algún tiempo tratando de diagnosticar, por ejemplo, posibles fallas en la unidad. A pesar de probar diferentes herramientas: línea de comando, nautilus, no pude mantener un rendimiento decente para operaciones de copia muy grandes.

Lo que funcionó mejor para mí fue usar el comandante de medianoche, y cada vez que la copia se volvía lenta, detenía la operación hasta que se apagaba la luz del disco duro después de que las operaciones pendientes se apagaban, generalmente un minuto más o menos, luego volvía a pausar MC y dispararía de nuevo a un ritmo decente durante otros 20-30 minutos. Aunque bastante molesto.

M Szil
fuente