it-swarm-tr.com

dosya son açıldığında

Dosyanın en son açıldığı zamanı almak ve bir dizindeki tüm dosyaları bu zamanlara göre sıralamak mümkün müdür?

101
student

Bu, tam olarak "açılmış" ile ne demek istediğinize bağlıdır, ancak genel olarak evet. Normalde kaydedilen üç zaman damgası vardır:

  • mtime - dosya içeriği değiştiğinde güncellenir. Çoğu durumda "varsayılan" dosya zamanıdır.
  • ctime - veya dosyası meta verileri (sahip, izinler) değiştiğinde güncellendi
  • atime - dosya okunduğunda güncellendi

Bu nedenle, genel olarak görmek istediğiniz bir dosyanın atime. Bunu stat veya ls ile alabilirsiniz. Bunu yapmak için ls -lu Kullanabilirsiniz, ancak ls -l --time=atime (Neredeyse tüm modern Linux dağıtımlarında desteklenmelidir) kullanmayı tercih etsem de, sık kullanmıyorum ve ne zaman daha iyi hatırlayabilir. Ve sıralamak zamana göre, -t Bayrağını ls'ye ekleyin. Al işte ozaman, buyur.

Yine de büyük bir uyarı var. Bir dosyanın her okunuşunda atime güncellemesi, genellikle gereksiz birçok IO'ya neden olur ve her şeyi yavaşlatır. Bu nedenle, çoğu Linux dağıtımı artık varsayılan olarak temel olarak zamanları öldüren noatime dosya sistemi bağlama seçeneğine veya yalnızca bir sınır geçtikten sonra (normalde günde bir kez) güncellenen relatime veya dosya önceki okumadan bu yana gerçekten değiştirildi. Bu seçeneklerin etkin olup olmadığını mount komutunu çalıştırarak bulabilirsiniz.

Ayrıca, erişim sürelerinin dosya adına göre değil, inode'a göre olduğuna dikkat edin, bu nedenle hardlink'leriniz varsa, birinden okumak aynı dosyaya atıfta bulunan tüm isimleri güncelleyecektir.

Ve, c 'ın yaratma' olmadığını unutmayın; oluşturma, Unix/Linux dosya sistemleri tarafından izlenmez, bu garip görünür ancak aslında mantıklıdır, çünkü dosya sisteminin orijinal olup olmadığını bilmenin bir yolu yoktur - belki dosya kırk yıl önce oluşturuldu ve buraya kopyalandı. Ve aslında, birçok dosya düzenleyici orijinalin üzerinde kopya yaparak çalışır. Bu bilgiye ihtiyacınız varsa, git gibi bir sürüm kontrol sistemi kullanmak en iyisidir.

182
mattdm

ls -ltu erişim zamanına göre göstererek ve sıralayarak tüm dosyaları listeler.

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

find komutu bunun için en iyisidir. Bkz. -ctime, -mtime, ve -atime seçenek

4
GBH

Girişiniz insan tüketimi içinse, erişim (okuma) zamanı için tarih sıralama bayraklarından (-tu Biriyle ls kullanın, değişiklik (yazma) zamanı için sadece -t Veya -tc İnode değiştirme süresi için). Daha fazla bilgi için mattdm'nin cevabı konusuna bakın (özellikle -a Ve -c Tanımına ilişkin uyarı).

Bu program tüketimi içinse, ls çıktısının ayrıştırılması sorunludur . Kabuğunuz zsh ise, yine de ls'ye ihtiyacınız yoktur: zsh, erişimi (*(Oa)), inode değişikliğini (*(Oc) artırarak eşleşmeleri sıralamak için zorlayıcı niteleyicilere sahiptir. ) veya değişiklik (*(Om)) süresi. Küçük bir o yaşı artırarak sıralar.

act_on_files_by_date *(Om)

Aksi takdirde, dosya adlarının yeni satır veya yazdırılamaz karakterler (geçerli yerel ayar) içermediğini biliyorsanız, böyle bir şey yapabilirsiniz.

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 dosyaya komut çağırmak istiyorsanız, daha fazla kuruluma ihtiyacınız vardır. Komut değişikliği sonucunda joker karakterler veya boşluk içeren dosya adları genişletileceği için act_on_files_by_date $(ls -t) işlevinin bu şekilde çalışmadığını unutmayın. Aşağıdaki kod, hiçbir dosya adı yeni satır veya yazdırılamaz bir karakter içermediği sürece çalışır:

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

Rasgele dosya adlarıyla başa çıkmak istiyorsanız, standart bir Kabuktan daha güçlü araçlara başvurmadan çok zor zamanlar geçireceksiniz: zsh, Perl, python…