archivo abierto la última vez


94

¿Es posible obtener la hora en que se abrió el archivo la última vez y ordenar todos los archivos en un directorio por esas horas?

Respuestas:


172

Esto depende exactamente de lo que quiere decir con "abierto", pero en general, sí. Hay tres marcas de tiempo grabadas normalmente:

  • mtime- actualizado cuando el contenido del archivo cambia. Este es el tiempo de archivo "predeterminado" en la mayoría de los casos.
  • ctime- actualizado cuando el archivo o sus metadatos (propietario, permisos) cambian
  • atime - actualizado cuando se lee el archivo

Entonces, generalmente, lo que quieres ver es el atimede un archivo. Puedes conseguir eso con stato con ls. Puede ls -luhacer esto, aunque prefiero usarlo ls -l --time=atime(que debería ser compatible con casi todas las distribuciones modernas de Linux) porque no lo uso a menudo, y cuando lo hago, puedo recordarlo mejor. Y para ordenar por tiempo, agregue la -tbandera a ls. Ahí vas.

Sin embargo, hay una gran advertencia. La actualización de atime cada vez que se lee un archivo provoca una gran cantidad de E / S generalmente innecesarias, lo que ralentiza todo. Por lo tanto, la mayoría de las distribuciones de Linux ahora tienen por defecto la noatimeopción de montaje del sistema de archivos, que básicamente mata a veces, o bien relatime, que solo actualiza a veces una vez que ha pasado un límite (normalmente una vez al día) o si el archivo se modificó realmente desde la lectura anterior. Puede encontrar si estas opciones están activas ejecutando el mountcomando.

Además, tenga en cuenta que los tiempos de acceso son por inodo, no por nombre de archivo, por lo que si tiene enlaces duros, leer uno actualizará todos los nombres que se refieren al mismo archivo.

Y tenga en cuenta que c no es "creación"; la creación no es rastreada por los sistemas de archivos Unix / Linux, lo que parece extraño pero en realidad tiene sentido porque el sistema de archivos no tiene forma de saber si es el original; tal vez el archivo fue creado hace cuarenta años y se copió aquí. Y, de hecho, muchos editores de archivos trabajan haciendo copias sobre el original. Si necesita esa información, es mejor usar un sistema de control de versiones como git.


99
Te daría más de +1 si pudiera, simplemente por no llamar a ctime "Creation Time".
jsbillings

2
Según la página de manual de mount, relatime no tiene nada que ver con los límites diarios, sino que solo analiza el tiempo en relación con mtime y ctime. Si atime es anterior a mtime o ctime, atime se actualiza. Si atime es más nuevo que ambos, entonces se deja solo. El propósito de esto es preservar la relación entre atime y mtime / ctime, ya que algunas aplicaciones usan esa información, como mutt para ver si ha leído su buzón desde la última vez que se actualizó.
jw013

1
@ jw013 Este ha sido el caso desde el kernel 2.6.30. Es cierto que algunas distribuciones antiguas pueden no tener este comportamiento. (Pero para distribuciones como Fedora, era cierto incluso cuando escribí la versión original de esta respuesta hace tres años). Busque una página de mountmanual actualizada .
mattdm

1
lsacorta el tiempo por defecto a una precisión razonable. Para ver el tiempo con total precisión se puede usar --full-time.
jlh

19

ls -ltu enumera todos los archivos, mostrando y ordenando por tiempo de acceso.

De man ls:

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time

4

El findcomando es el mejor para esto. Ver -ctime, -mtimey -atimeopciones


3

Si su listado es para consumo humano, úselo lscon uno de los indicadores de clasificación de fecha ( -tupara el tiempo de acceso (lectura), solo -tpara el tiempo de modificación (escritura) o -tcpara el tiempo de cambio de inodo). Consulte la respuesta de mattdm para obtener más información (en particular, la advertencia -ay la definición de -c).

Si esto es para el consumo del programa, analizar la salida de lses problemático . Si su shell es zsh, no necesita de lstodos modos: zsh tiene calificadores globales para ordenar las coincidencias aumentando el tiempo de acceso ( *(Oa)), cambio de inodo ( *(Oc)) o modificación ( *(Om)). Un otipo minúsculo al aumentar la edad.

act_on_files_by_date *(Om)

De lo contrario, si sabe que los nombres de archivo no contienen ninguna línea nueva o caracteres no imprimibles (en la configuración regional actual), puede hacer algo como

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

Si desea invocar un comando en muchos archivos a la vez, necesita más configuración. Tenga en cuenta que act_on_files_by_date $(ls -t)no funciona así, ya que los nombres de archivo que contienen caracteres comodín o espacios en blanco se ampliarían en el resultado de la sustitución del comando. El siguiente código funciona siempre que ningún nombre de archivo contenga una nueva línea o un carácter no imprimible:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

Si desea hacer frente a nombres de archivo arbitrarios, tendrá dificultades para recurrir a herramientas más potentes que un shell estándar: zsh, perl, python ...

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.