La mejor manera de enumerar 100 primeros archivos en un directorio ordenados por hora

12

¿Cuál sería la mejor manera de enumerar 100 primeros archivos en un directorio ordenado por la marca de tiempo creada (la más antigua primero)? El directorio es bastante grande (alrededor de 100000 archivos).

Se llega a la cabeza y lleva mucho tiempo completarlo.

Editar:

  • El sistema de archivos es ext3.
  • limitar el número de archivos en la carpeta no vale la pena, ya que esta será una operación de "limpieza" rara y los archivos son generados por un software de terceros.
  • Usar el tiempo modificado del archivo , en lugar del tiempo de creación, proporciona una solución aceptable.


fuente
1
Si se trata de una operación de limpieza, tal vez lo que desea es simplemente find -mtime +<number of days> -deletelimpiar todos los archivos anteriores a cierta edad. Eso significará que no es necesario ningún tipo.
Mikel

Respuestas:

14

Usted dice que " ls hilo a la cabeza lleva un tiempo tremendamente largo al completo".

La causa de esto no es ls, sino la cantidad de archivos en su directorio. Si tiene 100,000 archivos en un solo directorio, cualquier forma de resolver este problema tendría que obtener información sobre todos los 100,000 archivos antes de siquiera pensar en ordenarlos o imprimir cualquier salida.

Si tarda demasiado, la solución real es dividir los archivos en varios directorios.

Si no puede distribuir los archivos en varios directorios, ¿hay alguna forma de reducir el número de archivos a considerar ? por ejemplo, si los nombres de los archivos incluyen una fecha, tal vez pueda incluir un comodín para que el sistema no tenga que ordenar 100,000 archivos. ¿O tal vez están numerados secuencialmente? (Esto puede o no ayudar, pero vale la pena intentarlo).

¿Cuántas veces intentas hacer esto? Tal vez valga la pena guardar / almacenar en caché la salida para su reutilización .


Ahora una pregunta.

¿Estás seguro de que quieres decir "tiempo de creación" y no "tiempo de cambio" ? La mayoría de las herramientas solo pueden mostrar "tiempo de cambio", no "tiempo de creación".

Obtener el "tiempo de creación" es algo muy nuevo, que requiere un sistema de archivos ext4 y algunas herramientas que no son fáciles de instalar.


Si quieres cambiar el tiempo

El tiempo de cambio (ctime para abreviar) significa el tiempo que los atributos del archivo cambiaron por última vez.

ls -c ordena por ctime.

Desea la salida en orden ascendente, no descendente, por lo que también debe invertir la salida con la -ropción.

Entonces podrías hacerlo así:

ls -cr | head -n 100

Una solución más larga al mismo problema usando stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

pero eso corre más lento que ls -cren mi sistema.


Si quieres tiempo de modificación

El tiempo de modificación (mtime para abreviar) significa el tiempo que el contenido del archivo cambió por última vez.

ls -t ordena por mtime.

Cambiar ls -cra ls -tr(mejor opción) o cambiar stat -c $'%Z\t%n'a stat -c $'%Y\t%n'.


Si necesitas tiempo de creación

(Crtime para abreviar)

Esto es mas dificil.

Primero, asegúrese de que el directorio esté en un sistema de archivos que esté formateado con ext4. Puedes usar tune2fs -l <device name>para verificar esto.

Luego, hay un nuevo statformato llamado %W, que puede ayudarlo aquí. Para obtenerlo, deberá descargar una versión de GNU Coreutils lanzada en octubre de 2010 o posterior, extraerla, compilarla e instalarla.

Luego, dependiendo de su núcleo, esto podría funcionar (no lo he probado).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

Ver también:


Si recibe errores sobre "'$\t'

La '$\t'notación requiere basho zsh: no funcionará en dasho shen Ubuntu. Si realmente necesita usar esos proyectiles, tendrá que cambiar alguna \ta Ctrl+ V, Taby quitar el líder $de justo antes de la cita de apertura.

Mikel
fuente
Es posible que no esté ejecutando ext4. Ejecuto Ubuntu 10.04 en todas mis máquinas, pero ejecuto JFS en varias unidades. AFAIK JFS admite marcas de tiempo de creación.
jwernerny
En efecto. Sabemos que no es compatible con ext3 y es compatible con ext4. Una búsqueda rápida sugiere que podría funcionar con zfs o FreeBSD ufs, ¡pero ninguno de los dos es común en Ubuntu! No estoy seguro acerca de jfs o xfs o cualquier otra cosa. Estaría encantado de escuchar más si puede encontrar información / enlaces.
Mikel
Gracias por esa respuesta muy completa y por el sutil recordatorio de escribir preguntas más específicas;) "Buscar" resultó ser un ganador en cuanto al rendimiento, el tipo fs resultó ser ext3.
2

Otra forma si se descubre que hacer las cosas hoy podría ser relevante para sus problemas de rendimiento:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

En teoría, eso debería comenzar a producirse mucho más rápido, pero supongo que depende de dónde provenga el retraso. Podría tomar lsmucho tiempo ordenar los archivos.

Oli
fuente
Lo dudo. headen realidad sale tan pronto como haya leído suficiente entrada. Intenta correr con ambos timeen la parte delantera. La headversión es mucho más rápida en mi sistema de todos modos.
Mikel