Linux: usando find para localizar archivos anteriores a <date>

31

findtiene un buen soporte para encontrar archivos modificados hace menos de X días, pero ¿cómo puedo usar findpara localizar todos los archivos modificados después de una fecha determinada?

No puedo encontrar nada en la findpágina de manual para hacer esto, solo para compararlo con el tiempo de otros archivos o para verificar las diferencias entre el tiempo creado y el ahora. ¿Hacer un archivo con el tiempo deseado y compararlo es la única forma de hacerlo?

DrStalker
fuente
1
Esto sería mejor preguntar en SuperUser.com
Josh Brower
66
No voy a cerrar esto: también podría ser interesante para los administradores de sistemas.
splattne
El comando es para parte de una secuencia de comandos de copia de seguridad, que toma todo, desde / etc que se modificó después de la instalación en nuestras copias de seguridad nocturnas.
DrStalker
Nueve años y me di cuenta al moderar una nueva respuesta: el título y el cuerpo de esta pregunta no dicen lo mismo. El título pide 'archivos anteriores a <fecha>' pero el cuerpo dice 'modificado después de una fecha determinada'. Interpreto 'después' como más reciente que una fecha específica, no más antigua.
Joffrey

Respuestas:

19

Si solo tiene '-nuevo archivo', puede tomar esta solución alternativa:

touch -t 201003160120 some_file
find . -newer some_file

toque de hombre:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

Suponiendo que su toque tiene esta opción (el mío es táctil 5.97).

Krzysztof Krasoń
fuente
48

No, puede usar una cadena de fecha / hora.

De man find:

-newerXY reference
Compara la marca de tiempo del archivo actual con la referencia. El argumento de referencia es normalmente el nombre de un archivo (y una de sus marcas de tiempo se usa para la comparación), pero también puede ser una cadena que describe un tiempo absoluto. X e Y son marcadores de posición para otras letras, y estas letras seleccionan qué tiempo pertenece a cómo se usa la referencia para la comparación.

          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

Ejemplo:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
Pausado hasta nuevo aviso.
fuente
55
Estoy usando Centos 5.2, que usa GNU find versión 4.2.27, y no admite -newermt ni ningún parámetro -newer que no sea "-newer file"
DrStalker
1
GNU findutils 4.3.3 y versiones más recientes soporta -newerXY según savannah.gnu.org/bugs/?11668
Philip Durbin
25

No está directamente relacionado con la pregunta, pero podría ser interesante para algunos que tropiezan aquí.

El comando find no admite directamente el parámetro -older para buscar archivos anteriores a alguna fecha requerida, pero puede usar la declaración negate (usando el ejemplo de respuesta aceptada):

touch -t 201003160120 some_file
find . ! -newer some_file

devolverá archivos anteriores a la fecha proporcionada.

nEJC
fuente
3
editores: ¿tal vez debería fusionarse en una respuesta aceptada?
nEJC
esta solución es la forma más elegante de resolver este tipo de problema :)
Labynocle
9
find <dir> -mtime -20

Este comando de búsqueda encontrará archivos modificados en los últimos 20 días.

  • mtime -> modificado (atime = accedido, ctime = creado)
  • -20 -> menos de 20 días (20 exactamente 20 días, +20 más de 20 días)

Puede agregar limitaciones adicionales como:

find <dir> -mtime -20 -name "*.txt"

igual que antes, pero solo encuentra archivos que terminan en '.txt'.

markus_b
fuente
5

Solo para agregar: incluso puede usar dos argumentos más nuevos para buscar en un intervalo de tiempo:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

para encontrar todos los archivos de marzo de 2007.

MortenSickel
fuente
1

Podrías usar un script como este

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

Guárdelo en su $ PATH como "newerthan" y hágalo ejecutable.

Luego puede encontrar el archivo modificado después de una fecha determinada como esta:

newerthan "2010-03-10"

o

newerthan "last year"

o

newerthan "yesterday"

Eso debería hacer lo que quieras. No creo que haya una forma integrada de lograr esto de otra manera.

Richard Holloway
fuente
No es necesario usarlo bcpara matemáticas enteras, Bash puede hacerlo: ((seconds = when - now))el argumento de formato datedebe tener un plus date +%sy algunos sistemas pueden no tenerlodate -d
Pausado hasta nuevo aviso.
Esto es para Centos 5.2. Lo que tiene -d. Sin embargo, es útil saber acerca de las matemáticas de enteros.
Richard Holloway
1
find ! -newermt “<DATE>”

Me gusta esto:

find ! -newermt “jan 01 2015” 

Esto le dará archivos anteriores al 01-01-2015 en su directorio actual.

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/

Muzaffar Mahmood
fuente
Estaba a punto de escribir un comentario dándole la bienvenida en ServerFault y pidiéndole que reconsidere la posibilidad de presentar una respuesta duplicada hasta que me di cuenta de que el título y el cuerpo de la pregunta dicen cosas diferentes: el título pide 'archivos anteriores a <fecha>' y la pregunta dice 'modificado después de cierta fecha ', que en mi opinión son dos cosas diferentes. Tal vez podría en su publicación aclarar la diferencia y explicar el uso de la negación. Gracias por contribuir y publicaré un comentario sobre la pregunta para aclaración. ¡Gracias por contribuir!
Joffrey
0

si su fecha está formateada de manera que esté bien para la comparación,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
usuario37841
fuente