obtener la edad del archivo dado

12

¿Cómo puedo obtener la edad de un archivo determinado en, al menos, días?

Soy muy consciente de ls -lhcomandos similares. Quiero algo que funcione más o menos así:

getfage <FILE> # prints out '12d' (12 days)

Además, esto debe ser algo multiplataforma, ya que también me gustaría usar esto en Mac OS X, pero el caso de uso principal está en mi Linux-box.

NOTA

Como Linux no rastrea el tiempo de creación, estoy buscando una solución doble: una para mtime (linux), que es la última vez que se modificó dicho archivo, y otra para Mac OS X, que puede manejar mtime o tiempo de creación.

Alexej Magura
fuente
@slm Eso es específicamente sobre el tiempo de creación, no entra en calcular la edad en la línea de comando.
Gilles 'SO- deja de ser malvado'
@terdon, no realmente. Vea mi NOTA arriba.
Alexej Magura
@AlexejMagura y ¿cómo no te responden las respuestas en el engaño? statte da todo lo que necesitas ¿verdad?
terdon

Respuestas:

16

Unix no realiza un seguimiento de una fecha de creación. La única información disponible suele ser la última vez que los archivos fueron:

  1. Accedido
  2. Modificado
  3. Cambiado
  • Acceso: la última vez que se leyó el archivo
  • Modificar: la última vez que se modificó el archivo (se modificó el contenido)
  • Cambiar: la última vez que se modificaron los metadatos del archivo (por ejemplo, permisos)

( De esta respuesta )

Puede obtener fechas relacionadas con un archivo en particular usando el statcomando.

Ejemplo

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX y HFS

Si está utilizando OSX, el sistema de archivos que se utiliza en ese Unix es HFS . Este es uno de los pocos (que yo sepa) que mantiene la fecha de creación dentro del sistema de archivos, junto con la hora de modificación, etc. similar a otros Unixes.

extracto

Un registro de archivo almacena una variedad de metadatos sobre el archivo, incluido su CNID, el tamaño del archivo, tres marcas de tiempo (cuando se creó el archivo, se modificó por última vez, se realizó una última copia de seguridad), las primeras extensiones de archivo de los datos y los tenedores y punteros de recursos a los primeros registros de extensión de datos y recursos del archivo en el archivo de desbordamiento de extensión. El Registro de archivos también almacena dos campos de 16 bytes que usa el Finder para almacenar atributos sobre el archivo, incluidos su código de creador, código de tipo, la ventana en la que debe aparecer el archivo y su ubicación dentro de la ventana.

Marcas de tiempo

Las marcas de tiempo siempre se mantienen en el sistema de archivos, por lo que está limitado por el seguimiento de tiempo que se ofrece a través de ellos (EXT3, EXT4, XFS, etc.).

Sistemas de archivos

Si alguna vez tiene curiosidad, eche un vistazo a este tema de Wikipedia titulado: Comparación de sistemas de archivos . Tiene la lista más extensa de sistemas de archivos que conozco, junto con una buena tabla de las diversas características y el estado de si es compatible o no dentro de un sistema de archivos determinado.

Referencias

slm
fuente
Gracias por la actualización, eso ayuda. En realidad, leí aquí que ext4 puede mantener las fechas de creación, pero esto aún no se ha implementado en el núcleo.
terdon
@terdon: sí, tiene sentido que algunos sistemas de archivos lo admitan. Me parece que hace mucho tiempo, entiendo en el pasado por qué se dejó de lado, pero todo ha avanzado tanto desde el principio que no tiene sentido explícitamente no tener esto. También puede deshabilitar la compatibilidad con el tiempo de acceso para que pueda implementarse de manera similar y luego deshabilitarse si realmente no lo desea.
slm
18

OSX realiza un seguimiento de la creación de archivos, pero la mayoría de los otros dispositivos no lo hacen, por lo que no hay forma de saber el tiempo transcurrido desde la creación del archivo. Puede obtener el tiempo transcurrido desde su última modificación en casi cualquier sistema operativo.

No hay una utilidad de shell portátil para recuperar el tiempo de modificación de un archivo, excepto lsque tiene una salida que es casi imposible de analizar. En Linux, el siguiente comando imprime la antigüedad de un archivo:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

En Linux, puede usar stat -c %Y -- "$filename"como sinónimo de date +%s -r "$filename".

Los OSX datey los statcomandos son diferentes. Puede usar el siguiente comando:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

Los sistemas Linux no integrados y OSX tienen Perl instalado por defecto.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
Gilles 'SO- deja de ser malvado'
fuente
¿Depende esto del sistema operativo o del sistema de archivos? Este Q&A parece implicar que el sistema de archivos los mantiene, pero el núcleo debe proporcionar un método para acceder a ellos.
terdon
@terdon - mira mis actualizaciones.
slm
@terdon Ambos. Las preguntas y respuestas que enlace son correctas, los sistemas de archivos actuales han estado rastreando el tiempo de creación durante un tiempo. En FreeBSD, puede obtener esto desde stat, en Linux la syscall no ha sido modificada, por lo que debe recurrir a la piratería debugfs.
wingedsubmariner
1
@wingedsubmariner Con la advertencia de que el tiempo de creación en el sistema de archivos a menudo no es la fecha de creación en la aplicación, ya que muchas aplicaciones usan create-new-then-move como método para guardar una nueva versión en lugar de sobrescribir en el lugar.
Gilles 'SO- deja de ser malvado'
4

Según la respuesta de Gilles, aquí hay una función bash que devuelve la antigüedad del archivo en segundos o error.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}
Nicholas Sushkin
fuente
1
Función ordenada, fácil de adaptar agregando división simple para ver la edad en horas, días, semana ...
Emmanuel Devaux
0

Puede usar stat -f%B, ls -lUo mdls -n kMDItemFSCreationDatepara ver el tiempo de creación (nacimiento) en OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10
Lri
fuente
0
stat -c %Y <filename>

mira man statpara -copciones (formato)

Guido Rizzi
fuente