son açılan dosya açıldı


94

Dosyanın en son ne zaman açılacağı zamana gelip bir dizindeki tüm dosyaları bu zamana göre sıralamak mümkün mü?

Yanıtlar:


172

Bu tam olarak ne demek istediğin "açıl" dır, fakat genel olarak evet Normal olarak kaydedilmiş üç zaman damgası vardır:

  • mtime- dosya içerikleri değiştiğinde güncellenir. Bu, çoğu durumda "varsayılan" dosya süresidir.
  • ctime- dosya veya meta verileri (sahip, izinler) değiştiğinde güncellenir
  • atime - dosya okunduğunda güncellenir

Genelde görmek istediğin atime, bir dosya. Bunu ile statveya ile alabilirsiniz ls. Bunu kullanmayı ls -lutercih ls -l --time=atimeetmeme rağmen ( kullanmayı tercih ediyorum) (ki neredeyse tüm modern Linux dağıtımlarında desteklenmeli) çünkü sık kullanmıyorum ve yaptığım zaman daha iyi hatırlayabiliyorum. Ve zamana göre sıralamak için -tbayrak ls'ye ekleyin . Al işte ozaman, buyur.

Yine de büyük bir uyarı var. Bir dosyayı her okunuşunda atime güncelleme, genellikle gereksiz IO'ya neden olur ve her şeyi yavaşlatır. Bu nedenle, çoğu Linux dağıtımları artık varsayılan olarak, sadece bir sınır geçtikten sonra (normalde günde bir kez) veya dosya önceki okumadan bu yana değiştirilmişse, noatimeatimesleri öldüren temelde atimes'i öldüren dosya sistemi takma seçeneğinde varsayılandır relatime. mountKomutu çalıştırarak bu seçeneklerin etkin olup olmadığını görebilirsiniz .

Ayrıca, erişim zamanlarının dosya adına göre değil de inode olduğuna dikkat edin, bu nedenle hardlinksiniz varsa, birinden okumak aynı dosyaya başvuran tüm isimleri güncelleyecektir.

Ve c'nin "yaratılış" olmadığını unutmayın; Yaratılış, tuhaf görünen ama aslında mantıklı geldiği için Unix / Linux dosya sistemleri tarafından izlenmez, çünkü dosya sisteminin orijinal olup olmadığını bilme imkanı yoktur - belki de dosya kırk yıl önce oluşturulmuş ve buraya kopyalanmıştır. Ve aslında birçok dosya editörü, asılları kopyalayarak çalışır. Bu bilgilere ihtiyacınız olursa, bunun gibi bir sürüm kontrol sistemi kullanmak en iyisidir git.


9
Ctime "Creation Time" demediğim için sana +1'den fazlasını veririm.
jsbillings

2
Bağlama man sayfasına göre, relatime Günlük sınırları ile ilgisi vardır, ama sadece atime bakar akrabası mtime, ctime için. Atime, mtime veya ctime'den büyükse, atime güncellenir. Atime her ikisinden de daha yeniyse, yalnız bırakılır. Bunun amacı atime ve mtime / ctime arasındaki ilişkiyi korumaktır , çünkü bazı uygulamalar bu bilgiyi kullanır, örneğin en son güncellendiğinden beri posta kutunuzu okuduğunu görmek için mutt gibi.
jw013

1
@ jw013 Bu, 2.6.30 çekirdeğinden bu yana olmuştur. Bazı eski dağıtımların bu davranışa sahip olmadığı doğrudur. (Ancak Fedora gibi dağıtımlar için, bu cevabın orijinal versiyonunu üç yıl önce yazdığımda bile doğruydu.) Güncellenmiş bir sayfa ara mount.
mattdm

1
lssüreyi varsayılan olarak makul bir hassasiyetle kısaltır. Zamanı tam olarak görmek için kişi kullanabilirsiniz --full-time.
JLH

19

ls -ltu Erişim zamanına göre gösterilen ve sıralanan tüm dosyaları listeler.

Kimden 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

4

findKomut bunun için en iyisidir. Bkz -ctime, -mtimeve -atimeseçenekleri


3

Girişiniz insan tüketimi için lsise, tarih sıralama bayraklarından biriyle kullanın ( -tuerişim (okuma) zamanı, yalnızca -tdeğişiklik (yazma) zamanı veya -tcinode değiştirme zamanı). Daha fazla bilgi için mattdm'in cevabına bakınız (özellikle ilgili ihmal-a ve tanımı -c).

Eğer bu program tüketimi içinse , çıktısının ayrıştırılması lsproblemlidir . Eğer kabuğunuz zsh ise, lsyine de ihtiyacınız yok : zsh, access ( *(Oa)), inode change ( *(Oc)) veya modifikasyon ( *(Om)) süresini artırarak eşleşmeleri sıralamak için globbing elemelerine sahiptir . Küçük harf, oyaşı artırarak sıralar.

act_on_files_by_date *(Om)

Aksi takdirde, dosya adlarının yeni satır veya yazdırılamayan karakterler içermediğini biliyorsanız (geçerli yerel ayarda),

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

Aynı anda birçok dosya için bir komut çağırmak istiyorsanız, daha fazla kurulum yapmanız gerekir. Bunun act_on_files_by_date $(ls -t)böyle çalışmadığını unutmayın , çünkü joker karakter veya boşluk içeren dosya adları, komut değiştirme işleminin sonunda genişler. Aşağıdaki kod, hiçbir dosya adı yeni satır veya yazdırılamayan bir karakter içermediği sürece çalışır:

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

Keyfi dosya adlarıyla baş etmek istiyorsanız, standart bir kabuktan daha güçlü araçlara başvurmadan çok zorlanacaksınız: zsh, perl, python…

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.