ver varios una tamaño subdirectorios por para mover listar directorios crear copiar consola como comandos comando carpetas carpeta archivos linux folder folder-structure

una - mover varios archivos en linux



¿Número máximo de archivos/carpetas en Linux? (6)

Estoy desarrollando una tienda en línea LAMP, que permitirá al administrador cargar varias imágenes para cada artículo.

Mi preocupación es que, desde el principio, habrá 20000 elementos, lo que significa aproximadamente 60000 imágenes.

PREGUNTAS:

  1. ¿Cuál es el número máximo de archivos y / o carpetas en Linux?

  2. ¿Cuál es la forma habitual de manejar esta situación (mejores prácticas)?

Mi idea era crear una carpeta para cada elemento, en función de su ID única, pero aún así tendría 20000 carpetas en una carpeta de subidas principal y crecerá indefinidamente ya que los elementos antiguos no se eliminarán.

Gracias por cualquier ayuda.


60000 no es nada, 20000 también. Pero debes agrupar estos 20000 de cualquier modo para acelerar el acceso a ellos. Tal vez en grupos de 100 o 1000, tomando el número del directorio y dividiéndolo por 100, 500, 1000, lo que sea.

Por ejemplo, tengo un proyecto donde los archivos tienen números. Los agrupo en 1000, así que tengo

id/1/1332 id/3/3256 id/12/12334 id/350/350934

Es posible que tenga un límite estricto: algunos sistemas tienen inodos de 32 bits, por lo que está limitado a un número de 2 ^ 32 por sistema de archivos.


Además de las respuestas generales (básicamente "no molestes mucho" y "ajusta tu sistema de archivos" y "organiza tu directorio con subdirectorios que contienen unos pocos miles de archivos cada uno"):

Si las imágenes individuales son pequeñas (por ejemplo, menos de unos pocos kilobytes), en lugar de colocarlas en una carpeta, también puede colocarlas en una base de datos (por ejemplo, con MySQL como BLOB ) o tal vez dentro de un archivo indexado GDBM . Entonces, cada elemento pequeño no consumirá un inodo (en muchos sistemas de archivos, cada inodo quiere al menos algunos kilobytes). También puede hacer eso para algún umbral (p. Ej., Coloque imágenes de más de 4kbytes en archivos individuales y más pequeñas en una base de datos o archivo GDBM). Por supuesto, no olvide hacer una copia de seguridad de sus datos (y definir una estrategia de copia de seguridad).


El año es 2014. Vuelvo a tiempo para agregar esta respuesta. Un montón de archivos grandes / pequeños? Puede usar Amazon S3 y otras alternativas basadas en Ceph como DreamObjects, donde no hay límites de directorios de los que preocuparse.

Espero que esto ayude a alguien a decidir entre todas las alternativas.


Si el sistema de archivos de su servidor tiene la función dir_index activada (consulte tune2fs(8) para obtener detalles sobre cómo verificar y activar la función), entonces puede almacenar razonablemente hasta 100,000 archivos en un directorio antes de que se degrade el rendimiento. ( dir_index ha sido el valor predeterminado para los nuevos sistemas de archivos para la mayoría de las distribuciones desde hace varios años, por lo que solo sería un sistema de archivos antiguo que no tiene la función activada de forma predeterminada).

Dicho esto, agregar otro nivel de directorio para reducir la cantidad de archivos en un directorio en un factor de 16 o 256 mejoraría drásticamente las posibilidades de que cosas como ls * funcionen sin sobrepasar el tamaño máximo de argv del kernel.

Típicamente, esto se hace por algo como:

/a/a1111 /a/a1112 ... /b/b1111 ... /c/c6565 ...

es decir, añadir una letra o un dígito a la ruta, en función de alguna característica, puede calcular el nombre. (Los dos primeros caracteres de md5sum o sha1sum del nombre del archivo son un enfoque común, pero si tiene identificadores de objetos únicos, entonces ''a''+ id % 16 es un mecanismo bastante fácil para determinar qué directorio usar).


Los sistemas de archivos ext [234] tienen un número máximo fijo de inodos; Cada archivo o directorio requiere un inodo. Puede ver el conteo actual y los límites con df -i . Por ejemplo, en un sistema de archivos ext3 de 15 GB, creado con la configuración predeterminada:

Filesystem Inodes IUsed IFree IUse% Mounted on /dev/xvda 1933312 134815 1798497 7% /

No hay límite en directorios en particular más allá de esto; tenga en cuenta que cada archivo o directorio requiere al menos un bloque de sistema de archivos (generalmente 4KB), aunque sea un directorio con solo un elemento.

Sin embargo, como puede ver, es poco probable que 80,000 inodos sean un problema. Y con la opción dir_index (enablable con tune2fs ), las búsquedas en directorios grandes no son demasiado importantes. Sin embargo, tenga en cuenta que muchas herramientas administrativas (como ls o rm ) pueden tener dificultades para manejar directorios con demasiados archivos en ellos. Como tal, se recomienda dividir sus archivos para que no tenga más de unos pocos cientos a miles de elementos en un directorio determinado. Una forma fácil de hacer esto es hacer un hash de cualquier ID que estés usando y usar los primeros dígitos hexadecimales como directorios intermedios.

Por ejemplo, supongamos que tiene el Id. De artículo 12345, y hace un hash a ''DEADBEEF02842.......'' . Puede almacenar sus archivos en /storage/root/d/e/12345 . Ahora ha reducido el número de archivos en cada directorio en 1 / 256th.


md5($id) ==> 0123456789ABCDEF $file_path = items/012/345/678/9AB/CDE/F.jpg 1 node = 4096 subnodes (fast)