2013-07-26 10 views
8

Questo sembra essere un caso classico di funzionalità non standard su varie piattaforme.Il modo migliore per ottenere il tempo di modifica dei file in secondi

Semplicemente, voglio un metodo universalmente (o almeno ampiamente supportato) per ottenere il tempo modificato di un file come un timestamp unix in secondi.

Ora conosco vari modi per farlo con stat ma la maggior parte sono specifici della piattaforma; ad esempio stat -c %Y $file funziona per alcuni, ma non funzionerà su OS X (e presumibilmente altri sistemi FreeBSD) che utilizza invece stat -f %m $file.

Allo stesso modo, alcune piattaforme supportano date -r $file +%s, tuttavia OS X/FreeBSD ancora una volta non fa come l'opzione -r sembra essere solo un supplente per utilizzare +%s per ottenere un timestamp Unix, piuttosto che l'opzione di file di riferimento come su altre piattaforme.

L'altra alternativa che ho familiarità è utilizzare find con l'opzione -printf, ma ancora non è ampiamente supportato. L'ultimo metodo che conosco è l'analisi di ls che, oltre a essere una cosa spiacevole da fare, non è qualcosa su cui credo possa (o almeno dovrebbe) fare affidamento.

Quindi, esiste un metodo più compatibile per ottenere il tempo di modifica di un file? Attualmente sto solo lanciando diverse variazioni di stat in uno script e eseguendole fino a quando non si esce con uno stato pari a zero, ma questo è tutt'altro che ideale, anche se memorizzo in cache il comando correttamente eseguito prima in futuro.

risposta

6

Poiché sembra che non ci sia una soluzione "corretta" ho pensato di pubblicare il mio attuale per il confronto:

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 

[modifica] sto aggiornando questo per riflettere la maggiore versione aggiornata del codice che uso, in fondo si prova i due principali stat metodi e di un metodo piuttosto comune date a qualsiasi tentativo di ottenere il tempo modificato per la directory di lavoro corrente e, se uno dei metodi ha successo, crea una funzione che lo incapsula per essere usato successivamente nello script.

Questo metodo è diverso da quello che ho postato in precedenza, poiché esegue sempre qualche elaborazione, anche se get_modified_time non viene mai chiamato, ma è complessivamente più efficiente se è necessario chiamarlo la maggior parte del tempo. Ti consente anche di catturare una piattaforma non supportata in precedenza.

Se si preferisce la funzione che mette alla prova funziona solo quando viene chiamato, quindi ecco l'altra 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

Basta chiedere al sistema operativo il nome e andare da lì. In alternativa, scrivi un programma in C o usa Python o qualcos'altro che è abbastanza comune e più standardizzato: How to get file creation & modification date/times in Python?

+0

Non posso davvero fascio nulla; l'obiettivo è quello di avere un semplice script di shell che dovrebbe essere eseguito su quasi tutti i sistemi operativi unix-y. Il problema è che ho bisogno di includere ambienti come le scatole NAS, che potrebbero non includere Python o Perl. Non c'è davvero un modo migliore per farlo in una shell? – Haravikk

Problemi correlati