2013-07-26 20 views
8

Bu, çeşitli platformlarda standart olmayan özelliklerin klasik bir örneği gibi görünüyor.Saniyede Dosya Değiştirme Süresinin En İyi Yolu

Basitçe, bir dosyanın değiştirilen zamanını saniyeler içinde bir unix zaman damgası olarak almak için evrensel (veya en azından yaygın olarak desteklenen) bir yöntem istiyorum.

Şimdi bunu stat ile yapmanın çeşitli yollarını biliyorum, ancak çoğu platforma özeldir; Örneğin, stat -c %Y $file bazıları için çalışır, ancak bunun yerine stat -f %m $file kullanan OS X (ve muhtemelen diğer FreeBSD sistemleri) üzerinde çalışmayacaktır.

Aynı şekilde, bazı platformlar, date -r $file +%s destekleyen ancak OS X/FreeBSD tekrar yapar değil -r seçenek sadece unix zaman damgası yerine diğer platformlarda olduğu gibi referans dosyası seçeneğini almak için +%s kullanarak alternatif bir gibi görünüyor.

Tanıdığım diğer bir alternatif ise -printf seçeneği ile find kullanmaktır, ancak yine de bu yaygın olarak desteklenmemektedir. Bildiğim son yöntem ls'u ayrıştırmaktır, ki yapmaktan hoş olmayan bir şey olmanın yanı sıra, (ya da en azından) güvenilebilir olduğuna inandığım bir şey de değil.

Bir dosyanın değiştirilme zamanını almak için daha uyumlu bir yöntem var mı? Şu anda sadece stat'un farklı varyasyonlarını bir komut dosyasına atıyorum ve bir sıfır durumuyla çıkana kadar bunları çalıştırıyorum, ancak bu, gelecekteki başarılı komutu ilk önce çalıştırmamıza rağmen ideal olmaktan uzaktır.

cevap

6

Şu anki karşılaştırma için gönderdiğimi düşündüğüm bir "doğru" çözüm olmayabilir gibi görünüyor:

if stat -c %Y . >/dev/null 2>&1; then 
    get_modified_time() { stat -c %Y "$1" 2>/dev/null; } 
elif stat -f %m . >/dev/null 2>&1; then 
    get_modified_time() { stat -f %m "$1" 2>/dev/null; } 
elif date -r . +%s >/dev/null 2>&1; then 
    get_modified_time() { stat -r "$1" +%s 2>/dev/null; } 
else 
    echo 'get_modified_time() is unsupported' >&2 
    get_modified_time() { printf '%s' 0; } 
fi 

[değiştir] kullandığım kod güncel sürümünü daha yansıtmak için bu güncelleme ediyorum, temelde almak için herhangi bir girişimde iki ana stat yöntem ve biraz ortak date yöntemi testleri Geçerli çalışma dizini için değiştirilen zaman ve yöntemlerden biri başarılı olursa, betikte daha sonra kullanmak için onu kapsülleyen bir işlev oluşturur.

Bu yöntem, her zaman bazı işlemlerde bulunduğundan, gönderdiğim bir öncekinden farklıdır, get_modified_time asla çağrılmasa bile, çoğu zaman aramanız gerekiyorsa daha verimli bir şekilde geneldir. Ayrıca, daha önce desteklenmeyen bir platformu yakalamanıza da olanak tanır. Eğer çağrıldığında sadece fonksiyonlarını test işlevi tercih ederseniz

, sonra buraya başka formudur: Ben bir şey paket edemez

get_modified_time() { 
    modified_time=$(stat -c %Y "$1" 2> /dev/null) 
    if [ "$?" -ne 0 ]; then 
     modified_time=$(stat -f %m "$1" 2> /dev/null) 
     if [ "$?" -ne 0 ]; then 
      modified_time=$(date -r "$1" +%s 2> /dev/null) 
      [ "$?" -ne 0 ] && modified_time=0 
     fi 
    fi 
    echo "$modified_time" 
} 
0

Sadece işletim sisteminden adını sor ve oradan git. Alternatif olarak, bir C programı yazın veya Python'u ya da oldukça yaygın olan ve standart olan başka bir şey kullanın: How to get file creation & modification date/times in Python?

+0

; amaç, hemen hemen tüm unix-y işletim sistemlerinde çalışması gereken basit bir kabuk betiğine sahip olmaktır. Sorun, Python veya Perl'i içermeyen NAS kutuları gibi ortamları da içermem gerekiyor. Bunu bir kabukta yapmanın daha iyi bir yolu yok mu? – Haravikk

İlgili konular