Pertanyaan Kapan tanggal lahir untuk file yang sebenarnya digunakan? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saat saya mengetik berikut ini:

$ 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: -

Saya melihat Tanggal Lahir untuk /bin/bash tidak valid / kosong. Kapan bidang ini pernah digunakan dan tujuan apa yang mungkin ada di Linux saat berfungsi?

Saya menghargai ada cara penggunaan yang lebih singkat stat tetapi ini muncul selama siklus pengembangan dan saya salin dan tempel.


11
2018-05-24 03:01


asal


Kemungkinan duplikat dari Bagaimana saya menemukan waktu pembuatan file? Sangat berguna Jawaban muru, yang menawarkan suatu cara untuk mengakses waktu / waktu kelahiran, dan menunjukkan suka stat akan pernah benar-benar mendukungnya, pada sistem yang memiliki kernel panggilan sistem statx () yang baru. Ini tidak membutuhkan hak akses root. Lihat juga Kelahiran kosong di ext4 di Unix & Linux. - Eliah Kagan
@EliahKagan statx telah ada selama beberapa bulan di kernel Linux. Orang-orang belum cukup coding di ruang aplikasi untuk itu. Masih menarik minat saya dan saya berterima kasih kepada Anda karena telah mengingatkan saya tentang proyek back-burner ini. - WinEunuuchs2Unix


Jawaban:


Waktu lahir adalah waktu ketika file tersebut dibuat pada filesystem, juga dikenal sebagai waktu pembuatan file (crtime pada EXTFS). Perhatikan bahwa, ini tidak didefinisikan oleh POSIX; hanya waktu akses terakhir (atime), waktu modifikasi terakhir (mtime) dan waktu perubahan inode (ctime) diamanatkan oleh POSIX.

IIRC, Linux namun tidak menyediakan antarmuka untuk mendapatkan waktu lahir, ada proposal untuk xstat() dan fxstat(), belum diimplementasikan.

Seperti yang dicatat oleh @muru, pendekatan yang lebih baru adalah statx(), yang digabung dalam kernel mainline baru saja. Jadi, setiap toolpace (dimodifikasi) userspace dapat memanfaatkan itu (yang statx struktur sekarang, lihat di bawah) pada kernel terbaru.

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];
};

Sini stx_btime adalah waktu pembuatan file.

Sementara itu, stat menunjukkan tidak adanya bidang (atau nilai kosong) st_birthtime/st_birthtimesec dikembalikan oleh stat() panggilan, di stat struktur:

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 */
   };

Ada beberapa trik dengan permintaan debug tingkat sistem file untuk mendapatkan info pembuatan dari metadata FS, mis. untuk EXTFS:

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

asumsi FS file yang dimaksud adalah pada partisi /dev/sda1. Anda dapat mengekstrak nilai crtime untuk mendapatkan waktu pembuatan file.


17
2018-05-24 03:24



xstat adalah sejarah kuno. statx telah digabung baru-baru ini. - muru
Layak menunjukkan bahwa waktu pembuatan file tidak sering sangat berguna karena banyak editor teks akan menghemat dengan membuat file baru dan kemudian menimpa yang lama (berarti Anda tidak akan pernah mendapatkan file yang disimpan sebagian jika macet saat menyimpan). Di Windows mereka menggunakan beberapa peretasan ekstrim untuk membuat ini tampak berfungsi (kecuali jika tidak - lihat blogs.msdn.microsoft.com/oldnewthing/20050715-14/?p=34923) tetapi setahu saya tidak ada hal seperti itu di Linux. - Muzer
@heemayl Karena saya adalah Linux C noob dan hanya dapat menyalin, menempel & mengkompilasi, dapatkah Anda mengarahkan ke tautan di mana program C "membaca" struktur data kernel utama baru dan mencetaknya ke STDOUT? (Mohon maaf jika terminologi tidak aktif). - WinEunuuchs2Unix
@ WinEunuuchs2Unix Saya tidak berpikir program reguler yang ditulis ulang menggunakan statx() dari pada stat() tersedia sekarang di semua versi program utama seperti itu ... Anda dapat memeriksa sumber terbaru untuk memastikan bahwa jika beberapa program telah mengimplementasikan antarmuka dan kemudian mengompilasi program atau Anda dapat selalu menulis program Anda sendiri yang memanfaatkan statx()... Dalam kedua kasus, saya mengasumsikan bahwa Anda memiliki versi kernel yang diperlukan yang mengekspos statx()... - heemayl
@heemayl statx() ditambahkan dalam Kernel 4.11 yang saya pasang beberapa minggu yang lalu (versi 4.11.1 ). Saya telah mem-boot ulang versi ini dan akan mencoba untuk melihat apakah seseorang telah memposting program sampel untuk digunakan. Jika tidak saya harus mengunduh stat kode sumber perintah, memodifikasinya dan mengkompilasi ulang. Terima kasih atas jawaban Anda yang luar biasa dan semoga saya dapat memposting salinan kerja baru statx program dalam satu atau dua minggu :) PS Catatan samping yang menarik: statx () termasuk bidang baru untuk version number. Ini adalah sesuatu yang saya tanyakan beberapa hari yang lalu tentang cara menentukan nomor versi program. - WinEunuuchs2Unix


Ini harus menjadi waktu pembuatan file, tetapi ada masalah yang luar biasa, tim gnu coreutils menunggu xstat() mendukung di kernel.

TODO: stat (1) dan ls (1) dukungan untuk waktu lahir


2
2018-05-24 03:07