Saltar al contenido

¿Cómo puedo encontrar el archivo más antiguo en un árbol de directorios?

Ariana, parte de nuestro equipo de trabajo, nos hizo el favor de redactar este escrito porque conoce a la perfección el tema.

Solución:

Esto funciona (actualizado para incorporar la sugerencia de Daniel Andersson):

find -type f -printf '%T+ %pn' | sort | head -n 1

Este es un poco más portátil y porque no depende de GNU find extensión -printfpor lo que también funciona en BSD / OS X:

find . -type f -print0 | xargs -0 ls -ltr | head -n 1

El único inconveniente aquí es que está algo limitado al tamaño de ARG_MAX (cual deberían ser irrelevante para la mayoría de los núcleos más nuevos). Entonces, si hay más de getconf ARG_MAX caracteres devueltos (262,144 en mi sistema), no le da el resultado correcto. Tampoco es compatible con POSIX porque -print0 y xargs -0 no lo es

Algunas soluciones más a este problema se describen aquí: ¿Cómo puedo encontrar el archivo más reciente (más nuevo, más antiguo, más antiguo) en un directorio? – Wiki de Greg

Se garantiza que los siguientes comandos funcionan con cualquier tipo de nombre de archivo extraño:

find -type f -printf "%T+ %p" | sort -z | grep -zom 1 ".*" | cat

find -type f -printf "%[email protected] %T+ %p" | 
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'

stat -c "%y %n" "$(find -type f -printf "%[email protected] %p" | 
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"

Usando un null byte () en lugar de un carácter de avance de línea (n) se asegura de que la salida de find siga siendo comprensible en caso de que uno de los nombres de archivo contenga un carácter de avance de línea.

los -z switch hace que sort y grep solo interpreten null bytes como caracteres de fin de línea. Como no existe tal interruptor para la cabeza, usamos grep -m 1 en cambio (solo una aparición).

Los comandos están ordenados por tiempo de ejecución (medido en mi máquina).

  • El primer comando será el más lento, ya que primero tiene que convertir el mtime de cada archivo en un formato legible por humanos y luego ordenar esas cadenas. La canalización a gato evita colorear la salida.

  • El segundo comando es un poco más rápido. Si bien aún realiza la conversión de fecha, la clasificación numérica (sort -n) los segundos transcurridos desde la época de Unix son un poco más rápidos. sed borra los segundos desde la época de Unix.

  • El último comando no realiza ninguna conversión y debería ser significativamente más rápido que los dos primeros. El comando de búsqueda en sí no mostrará el mtime del archivo más antiguo, por lo que se necesita stat.

Páginas man relacionadas: find – grep – sed – sort – stat

Acuérdate de que tienes permiso de glosar tu experiencia si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *