¿Cómo mostrar la fecha y hora modificada con el comando 'buscar'?

85

Con un findcomando, puedo mostrar nombres de directorios con múltiples niveles. El siguiente comando muestra todos los directorios debajo de la /varruta con una profundidad de 2:

find /var -maxdepth 2 -type d;

El resultado muestra:

/var
/var/log
/var/log/sssd
/var/log/samba
/var/log/audit
/var/log/ConsoleKit
/var/log/gdm
/var/log/sa

Con un statcomando, puedo encontrar la fecha de modificación:

stat /var/log/samba | grep 'Modify:'

El resultado es:

Modify: 2014-01-02 11:21:27.762346214 -0800 

¿Hay alguna forma de combinar los dos comandos para que los directorios se enumeren con la fecha y la hora modificadas?

Purres
fuente

Respuestas:

63

Puede usar el -execmodificador findy definir el formato de salida de statusar el -cmodificador de la siguiente manera:

find /var -maxdepth 2 -type d -exec stat -c "%n %y" {} \;

Esto debería dar el nombre del archivo seguido de su hora de modificación en la misma línea de la salida.

rc0r
fuente
es mejor que mi respuesta, +1
Kent
La -printfsiguiente opción evita llamar statpor cada archivo encontrado. En mi prueba, el comando produce una salida casi idéntica, solo una precisión de un dígito adicional en los segundos.
mwfearnley
Para MacOS, el carácter arg de formato states -f. find /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \;
toddcscar
125

La respuesta aceptada funciona pero es lenta. No es necesario ejecutar la estadística para cada directorio, find proporciona la fecha de modificación y puede imprimirla directamente. Aquí hay un comando equivalente que es considerablemente más rápido:

 find /var -maxdepth 2 -type d -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"
kzar
fuente
4
Una solución mucho mejor. También funciona con findfrom msys que se ejecuta en Windows, que carece de un statcomando.
Snorfalorpagus
7
En Mac, 'brew install findutils' y luego gfind tiene la opción -printf.
WeakPointer
%Tcimpresiones "fecha y hora de las localidades", permitiendo que la cadena de formato "% p% Tc"
Andreas
Vínculos más útiles para la explicación de% formateadores. unix.stackexchange.com/a/215236/216480 o en la página de manual busque "-printf format"
styks
1
Si bien la cadena de formato "% p% Tc" funciona, formatea la salida de manera ligeramente diferente. Por ejemplo, "/ var / spool Lun 29 de septiembre de 2014 09:05:54 BST" en lugar de "/ var / spool 2014-09-29 09: 05: 54.000000000 +0100".
kzar
15

find /var -maxdepth 2 -type d | xargs ls -oAHd

Esta es una forma de obtener su ls comando muestre la ruta completa del directorio. Si bien lstiene el -Rparámetro de búsqueda recursiva, caminos no se mostrará en los resultados con el -lo la -oopción (en OSX, por lo menos), por ex con: ls -lR.

marca
fuente
Agregue una explicación de por qué esto responde a la pregunta. En general, cada vez que publica un código de ejemplo en una respuesta en StackOverflow, la cultura es proporcionar siempre una explicación. De lo contrario, corre el riesgo de que los moderadores eliminen su respuesta como una respuesta de baja calidad debido a su breve extensión y falta de explicación.
sideshowbarker
3
Este lo puedes lograr con el find /var -maxdepth 2 -type d -lsque es simplemente más simple.
Grzegorz Krauze
13

Las versiones recientes de GNU findtambién incluyen una -printfopción que incluye campos de fecha. Si necesita imprimir el nombre del archivo y la hora de modificación en el formato estándar "C", puede usar -printf "%c %p\n".

Si desea la fecha en un formato específico, puede usar el %Ccarácter de campo seguido de un campo. Por ejemplo, el año de 4 dígitos sería %CY, Ysiendo el carácter del año de 4 dígitos.
Tenga en cuenta que si necesita varios campos, deberá especificar %Cvarias veces. Por ejemplo, el formato AAAA-MM-DD se vería así %CY-%Cm-%Cd.

Consulte las páginas de manual o la documentación en línea para obtener detalles adicionales.

Aquí hay un ejemplo práctico:

find . -name favicon.ico -printf "%c %p\n"
Sr. Llama
fuente
8

Otro que utilizo para imprimir archivos modificados en el último día. ls -ltr me da más detalles como el tiempo de modificación, el usuario, etc.

find <my_dir> -mtime -1 -type f -print | xargs ls -ltr 
usuario666
fuente
1
Este es el más simple, más fácil de recordar y más rápido de escribir. (Lo uso sin los argumentos -mtime y -type, en lugar de usar una -name '*.ext'especificación. ls -ltOrdena la hora de modificación.)
Brent Faust
1
Esto no funciona cuando el nombre del archivo contiene espacios. Mejor es usar en -print0lugar de -printy luego usar en xargs -0lugar de xargs.
emk2203
1

prueba esta línea:

find /var -maxdepth 2 -type d|xargs stat|grep -E 'File|Modi'

aquí lo ejecuté, sale:

....
  File: ‘/var/cache/cups’
Modify: 2013-12-24 00:42:59.808906421 +0100
  File: ‘/var/log’
Modify: 2014-01-01 12:41:50.622172106 +0100
  File: ‘/var/log/old’
Modify: 2013-05-31 20:40:23.000000000 +0200
  File: ‘/var/log/journal’
Modify: 2013-12-15 18:56:58.319351603 +0100
  File: ‘/var/log/speech-dispatcher’
Modify: 2013-10-27 01:00:08.000000000 +0200
  File: ‘/var/log/cups’
Modify: 2013-12-22 00:49:52.888346088 +0100
  File: ‘/var/opt’
Modify: 2013-05-31 20:40:23.000000000 +0200
....
Kent
fuente