web-dev-qa-db-esp.com

Encuentra archivos creados entre un rango de fechas

Uso AIX a través de telnet aquí en el trabajo, y me gustaría saber cómo encontrar archivos en una carpeta específica entre un rango de fechas. Por ejemplo: deseo encontrar todos los archivos en la carpeta X que se crearon entre el 01-agosto-13 y el 31-agosto-13.

Observaciones:

  • El truco touch (donde creas dos archivos vacíos para usar la opción -newer) no me funciona, una vez que los roles de usuario que tengo en el servidor no me permiten crear archivos.
  • Necesito encontrar entre fechas específicas, no días (como: archivos que se crearon hace más de 30 días, etc.)
32
sanjuro8998

Puede usar lo siguiente para encontrar lo que necesita.

Encuentra archivos anteriores a una fecha/hora específica:

find ~/ -mtime $(echo $(date +%s) - $(date +%s -d"Dec 31, 2009 23:59:59") | bc -l | awk '{print $1 / 86400}' | bc -l)

O puede encontrar archivos entre dos fechas. Primera cita más reciente, última fecha, más antigua. Puede ir al segundo y no tiene que usar mtime. Puedes usar lo que necesites.

find . -mtime $(date +%s -d"Aug 10, 2013 23:59:59") -mtime $(date +%s -d"Aug 1, 2013 23:59:59")
7
Alex Atkinson

Si usa GNU find, desde la versión 4.3.3 puede hacer:

find -newerct "1 Aug 2013" ! -newerct "1 Sep 2013" -ls

Aceptará cualquier cadena de fecha aceptada por GNU date -d.

Puede cambiar el c en -newerct a cualquiera de a, B, c o m para mirar a tiempo/nacimiento/ctime/mtime.

Otro ejemplo: archivos de lista modificados entre las 17:30 y las 22:00 del 6 de noviembre de 2017:

find -newermt "2017-11-06 17:30:00" ! -newermt "2017-11-06 22:00:00" -ls

Detalles completos de man find:

   -newerXY reference
          Compares the timestamp of the current file with reference.  The reference argument is normally the name of a file (and one of its timestamps  is  used
          for  the  comparison)  but  it may also be a string describing an absolute time.  X and Y are placeholders for other letters, and these letters select
          which time belonging to how reference is used for the comparison.

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

          Some combinations are invalid; for example, it is invalid for X to be t.  Some combinations are not implemented on all systems; for example B  is  not
          supported on all systems.  If an invalid or unsupported combination of XY is specified, a fatal error results.  Time specifications are interpreted as
          for the argument to the -d option of GNU date.  If you try to use the birth time of a reference file, and the birth time cannot be determined, a fatal
          error  message  results.   If  you  specify a test which refers to the birth time of files being examined, this test will fail for any files where the
          birth time is unknown.
97
codebeard

Prueba esto:

find /var/tmp -mtime +2 -a -mtime -8 -ls

para buscar archivos de más de 2 días pero no más de 8 días.

40
frank42

Algunas buenas soluciones aquí. Quería compartir el mío, así como es corto y simple.

Estoy usando find (GNU findutils) 4.5.11

$ find search/path/ -newermt 20130801 \! -newermt 20130831
12
Jason Slobotski

Use stat para obtener el tiempo de creación. Puede comparar la hora en el formato YYYY-MM-DD HH:MM:SS lexicográficamente.

Este trabajo en Linux con tiempo de modificación, el tiempo de creación no es compatible. En AIX, la opción -c podría no ser compatible, pero de todos modos debería poder obtener la información, utilizando grep si nada más funciona.

#! /bin/bash
from='2013-08-01 00:00:00.0000000000' # 01-Aug-13
to='2013-08-31 23:59:59.9999999999'   # 31-Aug-13

for file in * ; do
    modified=$( stat -c%y "$file" )
    if [[ $from < $modified && $modified < $to ]] ; then
        echo "$file"
    fi
done
5
choroba