verilen dosyanın yaşını al


13

Belirli bir dosyanın yaşını en azından günlerde nasıl edinebilirim?

Ben de ls -lhbenzer komutların farkındayım . Böyle çalışacak bir şey istiyorum:

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

Ayrıca, bunu Mac OS X altında da kullanmak istediğim için biraz çapraz platform olmalı, ancak birincil kullanım durumu Linux kutumda.

NOT

Linux oluşturma süresini izlemediğinden , iki kat çözüm arıyorum: biri mtime (linux) için - bu dosya son kez değiştirildi - ve Mac OS X için bir tane mtime veya oluşturma zamanı.



@slm Bu özellikle oluşturma zamanı ile ilgilidir, komut satırındaki yaşı hesaplamaya girmez.
Gilles 'SO- kötü olmayı bırak


@terdon, pek değil. Yukarıdaki NOT'uma bakın .
Alexej Magura

@AlexejMagura ve dupe'deki cevaplar sizin için nasıl yapılmaz? statİhtiyacınız olan her şeyi veriyor mu?
terdon

Yanıtlar:


17

Unix, bir oluşturma tarihini takip etmez. Kullanılabilir tek bilgi genellikle dosyaların son kez olduğu zamandır:

  1. erişilen
  2. Değiştirilmiş
  3. değişmiş
  • Erişim - dosya en son okunduğunda
  • Değiştir - dosya en son değiştirildiğinde (içerik değiştirildi)
  • Değiştir - dosyanın son meta verileri değiştirildiğinde (ör. İzinler)

( Bu cevaptan )

statKomutu kullanarak belirli bir dosyayla ilgili tarihleri ​​alabilirsiniz .

Misal

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

OSX kullanıyorsanız, bu Unix altında kullanılan dosya sistemi HFS'dir . Bu, diğer Unix'lere benzer değişiklik zamanı vb. İle birlikte oluşturma tarihini dosya sisteminde tutan birkaç (farkında olduğum) dosyalardan biridir.

alıntı

Bir Dosya Kaydı, dosya hakkında CNID, dosyanın boyutu, üç zaman damgası (dosya oluşturulduğunda, en son değiştirilen, en son yedeklenen), verilerin ve kaynak çatallarının ve işaretçilerin ilk dosya uzantıları dahil olmak üzere çeşitli meta verileri depolar. Dosyanın Taşma Dosyasındaki ilk veri ve kaynak kapsamı kayıtlarına Dosya Kaydı, Finder tarafından dosya ile ilgili oluşturucu kodu, tür kodu, dosyanın görüntülenmesi gereken pencere ve pencerenin içindeki konumu gibi özellikleri saklamak için kullanılan 16 baytlık iki alanı da saklar.

Zaman damgaları

Zaman damgaları her zaman dosya sisteminde tutulur, bu nedenle bunlar aracılığıyla sunulan zaman izlemesi (EXT3, EXT4, XFS vb.) İle sınırlandırılırsınız.

Dosya sistemleri

Merak ediyorsanız şu Wikipedia konusuna bakın: Dosya sistemlerinin karşılaştırılması . Çeşitli özelliklerin güzel bir tablosu ve belirli bir dosya sisteminde desteklenip desteklenmediği durumu ile birlikte farkında olduğum en kapsamlı dosyatümleri listesine sahiptir.

Referanslar


Güncelleme için teşekkürler, bu yardımcı olur. Aslında, burada ext4'ün oluşturma tarihlerini tutabildiğini okudum ama bu henüz çekirdeğe uygulanmadı.
terdon

@terdon - evet bazı dosya sistemlerinin destekleyeceği mantıklı. Bana çok gecikmiş gözüküyor, geçmişte neden dışarıda bırakıldığını anlıyorum, ancak her şey o kadar ilerledi ki başlangıçtan beri açıkça buna sahip olmanın bir anlamı yok. Ayrıca, erişim süresi desteğini devre dışı bırakabilirsiniz, böylece benzer şekilde uygulanabilir ve gerçekten istemediyseniz devre dışı bırakabilirsiniz.
slm

19

OSX, dosya oluşturmayı izler, ancak diğer birçok birleşme yapmaz, bu nedenle dosya oluşturulduğundan bu yana geçen süreyi bilmenin bir yolu yoktur. Hemen hemen tüm işletim sistemlerinde son değişiklikten bu yana geçen süreyi elde edebilirsiniz.

Bir dosyanın değişiklik süresini almak için taşınabilir kabuk yardımcı programı yoktur, ancak lsayrıştırılması neredeyse imkansız olan çıktıya sahiptir. Linux altında, aşağıdaki komut bir dosyanın yaşını yazdırır:

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

Linux altında, stat -c %Y -- "$filename"eş anlamlısı olarak kullanabilirsiniz date +%s -r "$filename".

OSX'ler dateve statkomutlar farklı. Aşağıdaki komutu kullanabilirsiniz:

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

Gömülü olmayan Linux sistemlerinde ve OSX'te varsayılan olarak Perl yüklüdür.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"

Bu işletim sistemine veya dosya sistemine bağlı mı? Bu soru-cevap dosya sisteminin onları tuttuğunu ima ediyor gibi görünüyor, ancak çekirdeğin dosyalara erişmek için bir yöntem sağlaması gerekiyor.
terdon

@terdon - güncellemelerime bakın.
slm

@terdon İkisi de. Bağladığınız Soru-Cevap doğru, mevcut dosya sistemleri bir süredir oluşturulma süresini izliyor. FreeBSD'de bunu gerçekten alabilirsiniz, statLinux'ta sistem çağrısı yeniden işlenmedi, bu yüzden hacklemeye başvurmanız gerekiyor debugfs.
wingedsubmariner

1
@wingedsubmariner Dosya sisteminde oluşturma süresinin genellikle uygulamada oluşturulma tarihi olmadığı konusunda uyarıyla, birçok uygulama yerinde yazmak yerine yeni bir sürümü kaydetme yöntemi olarak create-new-then-move kullanmaktadır.
Gilles 'SO- kötü olmayı bırak

4

Gilles'in cevabına dayanarak, dosya yaşını saniye veya hata olarak döndüren bir bash işlevi.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}

1
Düzgün fonksiyon, Saat, Gün, hafta yaş görmek için basit bölme ekleyerek adapte etmek kolay ....
Emmanuel Devaux

0

Sen kullanabilirsiniz stat -f%B, ls -lUya da mdls -n kMDItemFSCreationDateOS X'de oluşturma (doğum) kez görmek:

$ 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

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.