Quando é a data de nascimento de um arquivo realmente usado? [duplicado]

12

Quando eu digito o seguinte:

$ IFS=$'\n'; arr=( $(stat "/bin/bash") ); for i in ${arr[@]} ; do echo $i ; done
  File: '/bin/bash'
  Size: 1037528     Blocks: 2032       IO Block: 4096   regular file
Device: 823h/2083d  Inode: 656086      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-23 16:38:03.848124217 -0600
Modify: 2017-05-16 06:49:55.000000000 -0600
Change: 2017-05-18 07:43:22.946694155 -0600
 Birth: -

Eu vejo a data de nascimento para /bin/bash é nula / vazia. Quando este campo é usado e qual o propósito dele no Linux quando funciona?

Eu aprecio que haja uma maneira mais curta de usar stat , mas isso surgiu durante o ciclo de desenvolvimento e copiei e colei.

    
por WinEunuuchs2Unix 24.05.2017 / 05:01

2 respostas

17

Horário de nascimento é a hora em que o arquivo foi criado no sistema de arquivos, também conhecido como o tempo de criação do arquivo ( crtime no EXTFS). Note que isto não é definido pelo POSIX; apenas o último tempo de acesso ( atime ), o tempo da última modificação ( mtime ) e o tempo de alteração do inode ( ctime ) são obrigatórios pelo POSIX.

IIRC, Linux ainda não fornece nenhuma interface para obter a hora de nascimento, existe uma proposta para xstat() e fxstat() , ainda a ser implementado.

Como @muru observou, a nova abordagem é statx() , que é mesclado no kernel principal recentemente. Assim, qualquer ferramenta de espaço de usuário (modificada) pode aproveitar isso (a estrutura statx agora, veja abaixo) em qualquer kernel recente.

struct statx {
    __u32   stx_mask;
    __u32   stx_blksize;
    __u64   stx_attributes;
    __u32   stx_nlink;
    __u32   stx_uid;
    __u32   stx_gid;
    __u16   stx_mode;
    __u16   __spare0[1];
    __u64   stx_ino;
    __u64   stx_size;
    __u64   stx_blocks;
    __u64   __spare1[1];
    struct statx_timestamp  stx_atime;
    struct statx_timestamp  stx_btime;
    struct statx_timestamp  stx_ctime;
    struct statx_timestamp  stx_mtime;
    __u32   stx_rdev_major;
    __u32   stx_rdev_minor;
    __u32   stx_dev_major;
    __u32   stx_dev_minor;
    __u64   __spare2[14];
};

Aqui stx_btime é o horário de criação do arquivo.

Nesse meio tempo, stat está mostrando a ausência dos campos (ou valores vazios) st_birthtime / st_birthtimesec retornados pela chamada stat() , na stat estrutura:

struct stat {
   dev_t     st_dev;     /* ID of device containing file */
   ino_t     st_ino;     /* inode number */
   mode_t    st_mode;    /* protection *
   nlink_t   st_nlink;   /* number of hard links */
   uid_t     st_uid;     /* user ID of owner */
   gid_t     st_gid;     /* group ID of owner */
   dev_t     st_rdev;    /* device ID (if special file) */
   off_t     st_size;    /* total size, in bytes */
   blksize_t st_blksize; /* blocksize for filesystem I/O */
   blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
   time_t    st_atime;   /* time of last access */
   time_t    st_mtime;   /* time of last modification */
   time_t    st_ctime;   /* time of last status change */
   };

Existem alguns truques com a solicitação de depuração no nível do sistema de arquivos para obter as informações de criação dos metadados do FS. para EXTFS:

debugfs -R 'stat /path/to/file' /dev/sda1

assumindo que o FS do arquivo em questão está na partição /dev/sda1 . Você pode extrair o valor de crtime para obter a hora de criação do arquivo.

    
por heemayl 24.05.2017 / 05:24
2

Deve ser o tempo de criação do arquivo, mas há um problema pendente, a equipe do gnu coreutils está aguardando o xstat() support no kernel.

TODO: stat (1) e ls (1) suporte para o horário de nascimento

    
por gdahlm 24.05.2017 / 05:07