¿Cómo usar 'buscar' para buscar archivos creados en una fecha específica? [cerrado]

254

¿Cómo uso el comando UNIX findpara buscar archivos creados en una fecha específica?

sverrejoh
fuente
8
Parece que se permiten preguntas de scripting bash.
Alan
@ MichaelScheper: Ni siquiera sé por dónde empezar con ese comentario.
Carreras de ligereza en órbita el
1
@Notinlist: Aquí está la respuesta: meta.stackexchange.com/questions/10249/… Desafortunadamente, resulta que un límite de tiempo ha expirado. Lástima, ya que las búsquedas en la web todavía llegan aquí, y la respuesta aceptada fue útil para mucha gente.
Michael Scheper
@MichaelScheper: Si puede encontrar una opción para votar para migrar a unix.stackexchange.com, apúnteme por todos los medios. Como no tiene el representante para ver el diálogo de cierre, le daré una pista: no hay ninguno. Considera ser menos combativo cuando no tienes idea de lo que estás hablando. Gracias por tu atención.
Carreras de ligereza en órbita
55
@LightnessRacesinOrbit: Pido disculpas por parecer "combativo". No se me permite editar mis comentarios, pero para referencia futura, ¿fue mi comentario elogiando la pregunta que lo ofendió? Debo decir que me siento un poco ciego, incluso después de darle a su comentario anterior el beneficio de la duda. En realidad, estaba tratando de ser más constructivo que agregar otro 'yo también', mirando cómo funciona la migración: meta.stackexchange.com/a/10250/249555 ¿Quizás el límite de tiempo de 60 días oculta esa opción? Perdón por el vagabundo. Gracias de nuevo, sinceramente, por su tiempo y atención.
Michael Scheper

Respuestas:

323

Como señaló Max, no puede, pero verificar archivos modificados o accedidos no es tan difícil. Escribí un tutorial sobre esto, tan tarde como hoy. La esencia de la cual es usar -newerXYy ! -newerXY:

Ejemplo: para buscar todos los archivos modificados el 7 de junio de 2007:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

Para buscar todos los archivos accedidos el 29 de septiembre de 2008:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

O, los archivos que tuvieron su permiso cambiado el mismo día:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Sin embargo, si no cambia los permisos en el archivo, 'c' normalmente correspondería a la fecha de creación.

Arve
fuente
77
Mi versión de find (GNU 4.2.32) no parece admitir los predicados -newerXY. ¿Se necesita una versión mínima particular? ¿O se trata de compilar find con un interruptor de configuración especial?
yukondude
1
@yukondude: Tienes razón. La versión de find que tengo localmente - GNU 4.4.0 - lo tiene, mientras que 4.1.20 que tengo en Dreamhost no. Sin embargo, el error con la creación de dos archivos también debería funcionar.
Arve
1
En algunos sistemas (FreeBSD, OS / X ...) -newerBtcoincidirá con el tiempo de nacimiento (creación) del archivo .
Stephane Chazelas
3
Tenga en cuenta que -newerxtestá disponible en FreeBSD desde 2001 (donde se proporcionó por primera vez como un parche en 1998), algunos otros BSD y GNU encuentran (desde 4.3.3 en 2007), basado en HP / UX find, que introdujo -newerXY(pero donde Y == t no es compatible).
Stephane Chazelas
Usando: find (GNU findutils) 4.4.0, esta sintaxis no funciona en SUSE ext3, si se supone que debe enumerar archivos / w mtime en esa fecha, no devuelve nada
niken
68

find location -ctime time_period

Ejemplos de time_period:

  • Hace más de 30 días: -ctime +30

  • Hace menos de 30 días: -ctime -30

  • Hace exactamente 30 días: -ctime 30

Chris
fuente
77
El problema es que quiero probar para una fecha específica, no dentro de un período de tiempo.
sverrejoh
1
Así que averigua cuántos días hace y usa ese número.
jmanning2k
15
ctimeno tiene nada que ver con el tiempo de creación , es el tiempo de cambio de inodo.
Stephane Chazelas
47

Son dos pasos, pero me gusta hacerlo de esta manera:

Primero cree un archivo con una fecha / hora particular. En este caso, el archivo es 01/10/2008 a medianoche

touch -t 0810010000 /tmp/t

Ahora podemos encontrar todos los archivos más nuevos o más antiguos que el archivo anterior (según la fecha de modificación del archivo. También puede usar -anewer para acceder y -cneer el estado del archivo cambiado).

find / -newer /tmp/t
find / -not -newer /tmp/t

También puede ver archivos entre ciertas fechas creando dos archivos con toque

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Esto encontrará archivos entre las dos fechas y horas

find / -newer /tmp/t1 -and -not -newer /tmp/t2
Mark Biek
fuente
3
+1 para solución a una persona mayor findque carece-newerXY
Felipe Alvarez
1
OMI, ahora mismo esta debería ser la solución aceptada. No pude hacer que -newermt se ejecute en el kernel 2.6.18-348.18.1.el5, y mucho menos en los núcleos más nuevos.
DarkForce
Lo mismo ocurre con DarkForce, la funcionalidad más reciente parece ser muy
inestable
34

Podrías hacer esto:

find ./ -type f -ls |grep '10 Sep'

Ejemplo:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24
Jeff MacDonald
fuente
¡Esto es lo que la mayoría de la gente quiere, pero no recibió suficientes votos positivos!
sjas
2
Esto podría no funcionar en tener unos pocos millones de archivos en un directorio.
Dennis Nolte
3
Hay efectos secundarios si el término de búsqueda grep está en el nombre del archivo.
Snorex
mywiki.wooledge.org/ParsingLs : un mejor enfoque es probablemente imprimir la fecha de creación en forma legible por máquina, tal vez con statsi no tiene find -printf.
tripleee
12

No puedes El modificador -c le indica cuándo se modificaron los permisos por última vez, -a prueba el tiempo de acceso más reciente y -m prueba el tiempo de modificación. El sistema de archivos utilizado por la mayoría de las versiones de Linux (ext3) no admite un registro de "tiempo de creación". ¡Lo siento!

Max Cantor
fuente
77
De hecho, no se trata solo del tipo de sistema de archivos: no existe una interfaz de sistema para obtener dicha información, incluso si el sistema de archivos la conserva. Una de las deficiencias de Unix se remonta a los primeros días, por lo que Unix nunca despegará.
chrisdowney
1
¿Unix nunca despegará?
lucid_dreamer
8

@Max: tiene razón sobre el tiempo de creación.

Sin embargo, si se desea calcular el argumento de días transcurridos para uno de los -atime, -ctime, -mtimeparámetros, se puede utilizar la siguiente expresión

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Reemplace "2008-09-24" con la fecha que desee y ELAPSED_DAYS se establecerá en la cantidad de días entre entonces y hoy. (Actualización: reste uno del resultado para alinearlo con findel redondeo de la fecha).

Entonces, para encontrar cualquier archivo modificado el 24 de septiembre de 2008, el comando sería:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Esto funcionará si su versión de findno admite los -newerXYpredicados mencionados en la respuesta de @Arve:.

yukondude
fuente
2

Con los modificadores -atime, -ctime y -mtime para buscar, puede acercarse a lo que desea lograr.

ayaz
fuente
-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
Tintín
fuente
1
¿Por qué estás copiando los archivos? Además del comando en `ls ...`obras, no utiliza la findherramienta.
Yamaneko
-5

Encontré este script en un script que elimina todos los archivos anteriores a 14 días:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Creo que un poco "man find" adicional y buscar los parámetros -ctime / -atime etc. te ayudarán aquí.

Georgi
fuente