dapatkan umur file yang diberikan

12

Bagaimana saya bisa mendapatkan usia file yang diberikan dalam, setidaknya, beberapa hari?

Saya sangat sadar ls -lh dan perintah serupa. Saya ingin sesuatu yang berfungsi seperti ini:

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

Juga, ini harus agak lintas platform karena saya juga ingin menggunakan ini di Mac OS X, tetapi kasus penggunaan utama ada di Linux-box saya.

CATATAN

Karena Linux tidak melacak waktu pembuatan, saya mencari solusi dua kali lipat: satu untuk mtime (linux) - yang terakhir kali mengatakan file diubah - dan satu untuk Mac OS X, yang dapat menangani mtime atau waktu pembuatan.

Alexej Magura
sumber
@slm Itu khusus tentang waktu pembuatan, itu tidak masuk ke menghitung usia pada baris perintah.
Gilles 'SANGAT berhenti menjadi jahat'
@terdon, tidak juga. Lihat CATATAN saya di atas.
Alexej Magura
@AlexejMagura dan bagaimana jawaban dalam dupe tidak cocok untuk Anda? statmemberi Anda semua yang Anda butuhkan, kan?
terdon

Jawaban:

16

Unix tidak melacak tanggal pembuatan. Satu-satunya informasi yang tersedia biasanya kali terakhir file itu:

  1. Diakses
  2. Diubah
  3. Berubah
  • Akses - terakhir kali file dibaca
  • Ubah - terakhir kali file diubah (konten telah dimodifikasi)
  • Ubah - terakhir kali meta data file diubah (mis. Izin)

( Dari jawaban ini )

Anda bisa mendapatkan tanggal yang terkait dengan file tertentu menggunakan statperintah.

Contoh

$ 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 dan HFS

Jika Anda menggunakan OSX, sistem file yang digunakan di bawah Unix itu adalah HFS . Ini adalah salah satu dari sedikit (yang saya tahu) yang membuat tanggal pembuatan dalam filesystem, bersama dengan waktu modifikasi dll. Mirip dengan Unix lainnya.

kutipan

Catatan File menyimpan berbagai metadata tentang file termasuk CNID-nya, ukuran file, tiga cap waktu (ketika file dibuat, terakhir dimodifikasi, terakhir dicadangkan), file pertama ekstensi data dan garpu sumber daya dan pointer. untuk data pertama dan catatan luas sumber daya dalam File Extent Overflow. Catatan File juga menyimpan dua bidang 16 byte yang digunakan oleh Finder untuk menyimpan atribut tentang file termasuk hal-hal seperti kode pembuatnya, kode jenis, jendela file yang akan muncul dan lokasinya di dalam jendela.

Cap waktu

Prangko waktu selalu dipertahankan dalam sistem file, sehingga Anda dibatasi oleh pelacakan waktu apa pun yang ditawarkan melalui mereka (EXT3, EXT4, XFS, dll.).

Sistem File

Jika Anda penasaran lihat topik Wikipedia ini berjudul: Perbandingan sistem file . Ia memiliki daftar filesystem yang paling luas yang saya ketahui bersama dengan tabel yang bagus dari berbagai fitur dan status apakah itu didukung atau tidak dalam sistem file yang diberikan.

Referensi

slm
sumber
Terima kasih atas pembaruannya, itu membantu. Sebenarnya, saya baca di sini bahwa ext4 dapat menyimpan tanggal pembuatan tetapi ini belum diimplementasikan di kernel.
terdon
@terdon - ya masuk akal bahwa beberapa filesystem akan mendukungnya. Rasanya sudah lama tertunda bagi saya, saya mengerti di masa lalu mengapa itu ditinggalkan, tetapi semuanya telah maju begitu banyak sejak awal sehingga tidak masuk akal untuk secara eksplisit tidak memilikinya. Anda juga dapat menonaktifkan dukungan untuk waktu akses sehingga dapat diterapkan dengan cara yang sama dan kemudian dinonaktifkan jika Anda benar-benar tidak menginginkannya.
slm
18

OSX melacak pembuatan file, tetapi sebagian besar lainnya tidak, jadi tidak ada cara untuk mengetahui waktu yang telah berlalu sejak pembuatan file. Anda dapat memperoleh waktu yang telah berlalu sejak modifikasi terakhir pada hampir semua sistem operasi.

Tidak ada utilitas shell portabel untuk mengambil waktu modifikasi file, kecuali lsyang memiliki output yang hampir tidak mungkin diurai. Di Linux, perintah berikut ini mencetak usia file:

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

Di Linux, Anda dapat menggunakan stat -c %Y -- "$filename"sebagai sinonim dari date +%s -r "$filename".

OSX datedan statperintah berbeda. Anda dapat menggunakan perintah berikut:

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

Sistem Linux dan OSX yang tidak tertanam memiliki Perl yang terinstal secara default.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apakah ini tergantung pada OS atau sistem file? Ini Q & A tampaknya menyiratkan bahwa filesystem membuat mereka tapi kernel perlu menyediakan metode untuk mengakses mereka.
terdon
@terdon - lihat pembaruan saya.
slm
@terdon Keduanya. T&J yang Anda tautkan itu benar, sistem file saat ini telah melacak waktu pembuatan untuk sementara waktu sekarang. Di FreeBSD, Anda sebenarnya bisa mendapatkannya dari ini stat, di Linux syscall belum dikerjakan ulang sehingga Anda harus menggunakan cara hacking debugfs.
wingedsubmariner
1
@wingedsubmariner Dengan peringatan bahwa waktu pembuatan dalam sistem file sering kali bukan tanggal pembuatan dalam aplikasi, karena banyak aplikasi menggunakan create-new-then-move sebagai metode untuk menyimpan versi baru daripada menimpa di tempat.
Gilles 'SANGAT berhenti menjadi jahat'
4

Berdasarkan jawaban oleh Gilles, berikut adalah fungsi bash yang mengembalikan usia file dalam hitungan detik atau kesalahan.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}
Nicholas Sushkin
sumber
1
Fungsi rapi, mudah beradaptasi dengan menambahkan pembagian sederhana untuk melihat usia dalam Hour, Days, week ....
Emmanuel Devaux
0

Anda dapat menggunakan stat -f%B,, ls -lUatau mdls -n kMDItemFSCreationDateuntuk melihat waktu pembuatan (kelahiran) di 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
sumber
0
stat -c %Y <filename>

melihat man statuntuk -c(format) Pilihan

Guido Rizzi
sumber