File terakhir kali dibuka

94

Apakah mungkin mendapatkan waktu ketika file dibuka terakhir kali dan mengurutkan semua file dalam direktori pada saat itu?

siswa
sumber

Jawaban:

172

Ini tergantung pada apa yang Anda maksud dengan "dibuka", tetapi secara umum, ya. Ada tiga cap waktu yang biasanya direkam:

  • mtime- diperbarui ketika konten file berubah. Ini adalah waktu file "default" dalam kebanyakan kasus.
  • ctime- diperbarui ketika file atau metadata (pemilik, izin) -nya berubah
  • atime - diperbarui ketika file dibaca

Jadi, secara umum, apa yang ingin Anda lihat adalah atimefile. Anda bisa mendapatkannya dengan statatau dengan ls. Anda dapat menggunakannya ls -luuntuk melakukan ini, walaupun saya lebih suka menggunakan ls -l --time=atime(yang seharusnya didukung di hampir semua distribusi Linux modern) karena saya tidak sering menggunakannya, dan ketika saya melakukannya saya dapat mengingatnya dengan lebih baik. Dan untuk mengurutkan berdasarkan waktu, tambahkan -tbendera ke ls. Jadi begitulah.

Namun ada satu peringatan besar. Memperbarui atime setiap kali file dibaca menyebabkan banyak IO yang biasanya tidak perlu, memperlambat semuanya. Jadi, sebagian besar distribusi Linux sekarang default untuk noatimeopsi mount filesystem, yang pada dasarnya membunuh atimes, atau yang lain relatime, yang hanya memperbarui atimes setelah batas telah lewat (biasanya sekali per hari) atau jika file benar-benar dimodifikasi sejak membaca sebelumnya. Anda dapat menemukan apakah opsi ini aktif dengan menjalankan mountperintah.

Juga, perhatikan bahwa waktu akses adalah dengan inode, bukan dengan nama file, jadi jika Anda memiliki hardlink, membaca dari satu akan memperbarui semua nama yang merujuk ke file yang sama.

Dan, ketahuilah bahwa c bukanlah "ciptaan"; penciptaan tidak dilacak oleh sistem file Unix / Linux, yang tampaknya aneh tetapi sebenarnya masuk akal karena sistem file tidak memiliki cara untuk mengetahui apakah itu asli - mungkin file itu dibuat empat puluh tahun yang lalu dan disalin di sini. Dan, nyatanya, banyak editor file bekerja dengan membuat salinan dari aslinya. Jika Anda memerlukan informasi itu, yang terbaik adalah menggunakan sistem kontrol versi suka git.

mattdm
sumber
9
Saya akan memberi Anda lebih dari +1 jika saya bisa, hanya karena tidak memanggil waktu "Waktu Pembuatan".
jsbillings
2
Menurut manual mount, relatime tidak ada hubungannya dengan batas harian, tetapi hanya melihat atime relatif terhadap mtime dan ctime. Jika atime lebih tua dari mtime atau ctime, atime diperbarui. Jika atime lebih baru dari keduanya, maka itu dibiarkan sendiri. Tujuannya adalah untuk menjaga hubungan antara atime dan mtime / ctime, karena beberapa aplikasi menggunakan informasi itu, seperti mutt untuk melihat apakah ia telah membaca kotak surat Anda sejak terakhir diperbarui.
jw013
1
@ jw013 Ini telah menjadi kasus sejak kernel 2.6.30. Memang benar bahwa beberapa distribusi yang lebih lama mungkin tidak memiliki perilaku ini. (Tetapi untuk distribusi seperti Fedora, itu benar bahkan kembali ketika saya menulis versi asli dari jawaban ini tiga tahun lalu.) Cari mounthalaman manual yang diperbarui .
mattdm
1
lsmempersingkat waktu secara default ke presisi yang masuk akal. Untuk melihat waktu dengan presisi penuh yang dapat digunakan --full-time.
jlh
19

ls -ltu daftar semua file, tunjukkan dan urutkan berdasarkan waktu akses.

Dari 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
Shawn J. Goff
sumber
4

The findperintah terbaik untuk ini. Lihat -ctime, -mtimedan -atimepilihan

GBH
sumber
3

Jika cantuman Anda adalah untuk konsumsi manusia, gunakan lsdengan salah satu bendera penyortiran tanggal ( -tuuntuk akses (baca) waktu, hanya -tuntuk waktu modifikasi (tulis) atau -tcuntuk waktu perubahan inode). Lihat jawaban mattdm untuk informasi lebih lanjut (khususnya peringatan tentang -adan definisi -c).

Jika ini untuk konsumsi program, penguraian output lsbermasalah . Jika shell Anda adalah zsh, Anda tidak perlu ls: zsh memiliki kualifikasi globbing untuk mengurutkan pertandingan dengan meningkatkan akses ( *(Oa)), perubahan inode ( *(Oc)) atau waktu modifikasi ( *(Om)). Huruf kecil oberubah seiring bertambahnya usia.

act_on_files_by_date *(Om)

Jika tidak, jika Anda tahu bahwa nama file tidak mengandung baris baru atau karakter yang tidak dapat dicetak (di lokal saat ini), maka Anda dapat melakukan sesuatu seperti

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

Jika Anda ingin menjalankan perintah pada banyak file sekaligus, Anda perlu pengaturan lebih lanjut. Catatan yang act_on_files_by_date $(ls -t)tidak berfungsi seperti ini, karena nama file yang mengandung karakter wildcard atau spasi akan diperluas dalam hasil substitusi perintah. Kode berikut berfungsi selama tidak ada nama file yang mengandung baris baru atau karakter yang tidak dapat dicetak:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

Jika Anda ingin mengatasi nama file yang sewenang-wenang, Anda akan mengalami kesulitan tanpa menggunakan alat yang lebih kuat daripada shell standar: zsh, perl, python ...

Gilles
sumber