¿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?

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.


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"

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.


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"

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 

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
....
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.