linux - una - Buscar archivos en creado entre un rango de fechas
ver archivos por fechas linux (6)
Utilizo 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: quiero encontrar todos los archivos en la carpeta X que se crearon entre el 01-Ago-13 y el 31-Ago-13.
Observaciones:
- El truco
touch
(donde creas dos archivos vacíos para usar la opción -newer) no funciona para mí, 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 creados hace más de 30 días, etc ...)
Script Oldfiles
Intenté responder a esta pregunta de una manera más completa y terminé creando un script completo con opciones para ayudarlo a comprender el comando de find
.
El script oldfiles
está en este repository
Para "crear" un nuevo comando de búsqueda, ejecútelo con la opción -n
(ejecución en seco), y le imprimirá el comando de find
correcto que necesita usar.
Por supuesto, si omite la -n
solo se ejecutará, no es necesario volver a escribir el comando de find
.
Uso:
$ oldfiles [-v...] ([-h|-V|-n] | {[(-a|-u) | (-m|-t) | -c] (-i | -d | -o| -y | -g) N (-/> | -/< | -/=) [-p "pat"]})
- Donde las opciones se clasifican en los siguientes grupos:
- Ayuda e información:
-h, --help: Muestra esta ayuda.
-V, --version: Mostrar versión.
-v, --verbose: Activa el modo verboso (acumulativo).
-n, --dry-run: no ejecute, solo explique cómo crear un comando "buscar" - Tipo de tiempo (acceso / uso, hora de modificación o cambio de estado):
-a o -u: tiempo de acceso (uso)
-m o -t: tiempo de modificación (predeterminado)
-c: cambio de estado del inodo - Rango de tiempo (donde N es un entero positivo):
-i N: minutos (predeterminado, con N igual a 1 minuto)
-d N: días
-o N: meses
-y N: años
-g N: N es una FECHA (ejemplo: "2017-07-06 22:17:15") - Pruebas:
-p "pat": patrón opcional para hacer coincidir (ejemplo: -p "* .c" para encontrar archivos c) (predeterminado -p "*")
- />: el archivo es más nuevo que el rango dado, es decir, el tiempo modificado después de él.
- / <: el archivo es anterior al rango dado, es decir, el tiempo es anterior a él. (defecto)
- / =: archivo que tiene exactamente N (min, día, mes, año) de antigüedad.
- Ayuda e información:
Ejemplo:
- Encuentre los archivos fuente de C más recientes que 10 minutos (tiempo de acceso) (con verbosidad 3):
$ oldfiles -a -i 10 -p"*.c" -/> -nvvv Starting oldfiles script, by beco, version 20170706.202054... $ oldfiles -vvv -a -i 10 -p "*.c" -/> -n Looking for "*.c" files with (a)ccess time newer than 10 minute(s) find . -name "*.c" -type f -amin -10 -exec ls -ltu --time-style=long-iso {} + Dry-run
- Encuentre archivos de encabezado H anteriores a un mes (tiempo de modificación) (verbosidad 2):
$ oldfiles -m -o 1 -p"*.h" -/< -nvv Starting oldfiles script, by beco, version 20170706.202054... $ oldfiles -vv -m -o 1 -p "*.h" -/< -n find . -name "*.h" -type f -mtime +30 -exec ls -lt --time-style=long-iso {} + Dry-run
- Encuentre todos los archivos (*) en un solo día (1 de diciembre de 2016; sin verbosidad, en seco):
$ oldfiles -mng "2016-12-01" -/= find . -name "*" -type f -newermt "2016-11-30 23:59:59" ! -newermt "2016-12-01 23:59:59" -exec ls -lt --time-style=long-iso {} +
Por supuesto, eliminando el -n
el programa ejecutará el comando de find
y le ahorrará el problema.
Espero que esto ayude a todos a aprender finalmente estas opciones {a,c,t}{time,min}
.
la salida LS:
También notará que la opción "ls" ls OPT
cambia para coincidir con el tipo de tiempo que elija.
Enlace para clonar / descargar el script oldfiles
:
Algunas buenas soluciones aquí. Quería compartir la mía, así como es corto y simple.
Estoy usando find (GNU findutils) 4.5.11
$ find search/path/ -newermt 20130801 /! -newermt 20130831
Prueba esto:
find /var/tmp -mtime +2 -a -mtime -8 -ls
para buscar archivos con más de 2 días pero no con más de 8 días.
Puedes usar lo siguiente para encontrar lo que necesitas.
Buscar 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 puedes encontrar archivos entre dos fechas. Primera fecha más reciente, última fecha, más antigua. Puedes bajar a la segunda y no tienes 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")
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 c
en -newerct
a cualquiera de a
, B
, c
o m
para ver atime / birth / ctime / mtime.
Otro ejemplo: enumere los archivos 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
Todos los detalles del 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.
Usa 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, tiempo de creación no es compatible. En AIX, la opción -c
podría no ser compatible, pero debería poder obtener la información de todos modos, 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