2013-07-26 11 views
8

To wydaje się być klasycznym przypadkiem niestandardowych funkcji na różnych platformach.Najlepszy sposób na uzyskanie pliku Czas modyfikacji w sekundach

Po prostu chcę uniwersalnej (lub przynajmniej szeroko) obsługiwanej metody uzyskiwania zmodyfikowanego czasu pliku jako znacznika czasu unixowego w sekundach.

Teraz wiem o różnych sposobach zrobienia tego z stat, ale większość z nich jest specyficzna dla platformy; na przykład stat -c %Y $file działa dla niektórych, ale nie działa w systemie OS X (i prawdopodobnie innych systemach FreeBSD), który zamiast tego używa stat -f %m $file.

Podobnie, niektóre platformy obsługują date -r $file +%s jednak OS X/FreeBSD ponownie nie jako opcja -r wydaje się być po prostu alternatywny do korzystania +%s uzyskania uniksowego znacznika czasu, zamiast opcji pliku odniesienia, jak na innych platformach.

Inną alternatywą, którą znam jest użycie opcji find z opcją , ale znowu nie jest ona szeroko obsługiwana. Ostatnią znaną mi metodą jest analizowanie ls, co oprócz tego, że jest nieprzyjemną rzeczą do zrobienia, nie jest czymś, w co moim zdaniem może (lub przynajmniej powinienem) polegać.

Czy istnieje zatem bardziej kompatybilna metoda uzyskania zmodyfikowanego czasu pliku? Obecnie wrzucam do skryptu różne odmiany stat i uruchamiam je, dopóki nie wyjdzie ze stanem zerowym, ale jest to dalekie od ideału, nawet jeśli buforowałem pomyślne polecenie, aby uruchomić je w przyszłości.

Odpowiedz

6

Ponieważ wydaje się, że nie ma "poprawnego" rozwiązania, pomyślałem, że do porównania dodaję mój aktualny:

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 

[edytuj] mam aktualizację tego celu odzwierciedlenia bardziej aktualną wersję kodu używam, w zasadzie sprawdza to dwa główne stat metod i nieco wspólnej metody date w każdej próbie uzyskania jak zmodyfikowany czas dla bieżącego katalogu roboczego, a jeśli jedna z metod się powiedzie, tworzy funkcję hermetyzującą dla późniejszego użycia w skrypcie.

Ta metoda różni się od poprzedniej, która została opublikowana, ponieważ zawsze wykonuje pewne przetwarzanie, nawet jeśli get_modified_time nigdy nie jest wywoływana, ale jest bardziej wydajna ogólnie, jeśli trzeba ją wywoływać przez większość czasu. Pozwala także na wcześniejszą przechwycenie nieobsługiwanej platformy.

Jeśli wolisz funkcję, tylko testuje funkcje kiedy to się nazywa, to tutaj jest inna forma:

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

Po prostu spytaj system operacyjny o jego nazwę i idź dalej. Możesz też napisać program w języku C lub użyć języka Python lub czegoś innego, co jest dość powszechne i bardziej znormalizowane: How to get file creation & modification date/times in Python?

+0

nie mogę nic pakiet; celem jest posiadanie prostego skryptu powłoki, który powinien działać na prawie każdym unixowym systemie operacyjnym. Problem polega na tym, że muszę uwzględnić środowiska takie jak NAS, które mogą nie zawierać Pythona lub Perla. Czy naprawdę nie ma lepszego sposobu na zrobienie tego w powłoce? – Haravikk

Powiązane problemy