¿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?
¿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:
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) cambianatime
- actualizado cuando se lee el archivoEntonces, generalmente, lo que quieres ver es el atime
de un archivo. Puedes conseguir eso con stat
o con ls
. Puede ls -lu
hacer 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 -t
bandera 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 noatime
opció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 mount
comando.
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
.
mount
manual actualizada .
ls
acorta el tiempo por defecto a una precisión razonable. Para ver el tiempo con total precisión se puede usar --full-time
.
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
Si su listado es para consumo humano, úselo ls
con uno de los indicadores de clasificación de fecha ( -tu
para el tiempo de acceso (lectura), solo -t
para el tiempo de modificación (escritura) o -tc
para el tiempo de cambio de inodo). Consulte la respuesta de mattdm para obtener más información (en particular, la advertencia -a
y la definición de -c
).
Si esto es para el consumo del programa, analizar la salida de ls
es problemático . Si su shell es zsh, no necesita de ls
todos modos: zsh tiene calificadores globales para ordenar las coincidencias aumentando el tiempo de acceso ( *(Oa)
), cambio de inodo ( *(Oc)
) o modificación ( *(Om)
). Un o
tipo 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 ...