GNU/Linux >> Tutoriales Linux >  >> Linux

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

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

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

Este es un poco más portátil y porque no depende de GNU find extensión -printf , por 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 (que debería 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\0" | sort -z | grep -zom 1 ".*" | cat

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

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

Usando un byte nulo (\0 ) en lugar de un carácter de salto 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 salto de línea.

El -z switch hace que sort y grep interpreten solo bytes nulos como caracteres de final de línea. Como no existe tal cambio para la cabeza, usamos grep -m 1 en cambio (solo una ocurrencia).

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 tubería a cat 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í mismo no mostrará el mtime del archivo más antiguo, por lo que se necesita stat.

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


Linux
  1. Cómo encontrar el archivo más antiguo en un árbol de directorios en Linux

  2. ¿Cómo puedo crear un árbol de directorios en C++/Linux?

  3. ¿Cómo puedo calcular una suma de comprobación md5 de un directorio?

  4. ¿Cómo puedo ejecutar dos2unix en un directorio completo?

  5. ¿Cómo obtengo el directorio absoluto de un archivo en bash?

Cómo encontrar el tamaño total de un directorio en Linux

¿Cómo encuentro la ubicación MySQL my.cnf?

¿Cómo puedo crear un archivo en cada carpeta?

¿Cómo puedo encontrar un archivo/directorio que podría estar en cualquier lugar de la línea de comandos de Linux?

¿Cómo puedo editar todos los archivos devueltos por find in vi en Linux?

¿Cómo encontrar el administrador de archivos predeterminado?