it-swarm-id.com

File terakhir kali dibuka

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

101
student

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 ata metadata-nya (pemilik, izin) berubah
  • atime - diperbarui ketika file dibaca

Jadi, secara umum, apa yang ingin Anda lihat adalah atime dari suatu file. Anda bisa mendapatkannya dengan stat atau dengan ls. Kamu bisa menggunakan ls -lu untuk 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 ke rut berdasarkan waktu, tambahkan -t Tandai ke ls. Jadi begitulah.

Tapi ada peringatan besar. Memperbarui atime setiap kali file dibaca menyebabkan banyak IO yang biasanya tidak perlu, memperlambat semuanya. Jadi, sebagian besar distribusi Linux sekarang menjadi default untuk opsi mount filesystem noatime, yang pada dasarnya membunuh atimes, atau relatime lainnya, yang hanya memperbarui atimes setelah batas telah lewat (biasanya sekali per hari) atau jika file tersebut sebenarnya telah dimodifikasi sejak pembacaan sebelumnya. Anda dapat menemukan apakah opsi ini aktif dengan menjalankan perintah mount.

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 bukan "kreasi"; 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, pada kenyataannya, banyak editor file bekerja dengan membuat salinan di atas aslinya. Jika Anda memerlukan informasi itu, yang terbaik adalah menggunakan sistem kontrol versi seperti git.

182
mattdm

ls -ltu daftar semua file, ditampilkan dan disortir 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
21
Shawn J. Goff

Perintah find adalah yang terbaik untuk ini. Lihat -ctime, -mtime, dan -atime pilihan

4
GBH

Jika cantuman Anda adalah untuk konsumsi manusia, gunakan ls dengan salah satu flag pengurutan tanggal (-tu Untuk waktu akses (baca), cukup -t Untuk waktu modifikasi (tulis) atau -tc Untuk waktu perubahan inode). Lihat jawaban mattdm untuk informasi lebih lanjut (khususnya peringatan tentang -a Dan definisi -c).

Jika ini untuk konsumsi program, parsing output ls bermasalah . Jika Shell Anda adalah zsh, Anda tidak perlu ls tetap: zsh memiliki kualifikasi globbing untuk mengurutkan pertandingan dengan meningkatkan akses (*(Oa)), perubahan inode (*(Oc) ) atau modifikasi (*(Om)) waktu. Huruf kecil o diurutkan dengan 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 lokasi 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. Perhatikan bahwa 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 ...