Voglio controllare in linux bash se un file è stato creato più di x volte fa.
diciamo che il file si chiama text.txt e il tempo è di 2 ore.
if [ what? ]
then
echo "old enough"
fi
Voglio controllare in linux bash se un file è stato creato più di x volte fa.
diciamo che il file si chiama text.txt e il tempo è di 2 ore.
if [ what? ]
then
echo "old enough"
fi
Risposte:
Solo per l'ora di modifica
if test `find "text.txt" -mmin +120`
then
echo old enough
fi
È possibile utilizzare -cmin
per la modifica o -amin
per il tempo di accesso. Come altri hanno sottolineato, non credo che tu possa tenere traccia del tempo di creazione.
find
restituisse un valore diverso da zero quando non vengono trovate corrispondenze.
text.txt
si presume che non sia una directory.
[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Mi è sempre piaciuto usare date -r /the/file +%s
per trovare la sua età.
Puoi anche farlo touch --date '2015-10-10 9:55' /tmp/file
per ottenere un tempo estremamente preciso su una data / ora arbitraria.
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
[con l'ipotesi che abbia creato e mai modificato, o "età relativa a mod"]
function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
è, se non deprecata , almeno vecchia e meno portabile , e si dovrebbe $(( ))
invece usare ; e le citazioni arretrate sono più fragili di $( )
; e anche i trattini nei nomi delle funzioni potrebbero non essere completamente portabili. L'essenza è buona, però!
Usando il stat
per capire la data dell'ultima modifica del file, date
per capire l'ora corrente e un uso liberale dei bashismi, si può fare il test che si desidera in base all'ora dell'ultima modifica del file 1 .
if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
echo "$somefile is older then 2 hours"
fi
Anche se il codice è un po 'meno leggibile find
rispetto all'approccio, penso che sia un approccio migliore rispetto a correre find
a guardare un file che hai già "trovato". Inoltre, la manipolazione della data è divertente ;-)
%Z
invece di %Y
sotto per ottenere "l'ora di modifica" che potrebbe essere quella che desideri.[Aggiornare]
Per gli utenti Mac, utilizzare al stat -f "%m" $somefile
posto della sintassi specifica per Linux sopra
stat
non è incorporato - molto male da parte mia, lo aggiusterò.
L'ora di creazione non viene memorizzata.
Ciò che viene memorizzato sono tre timestamp (generalmente, possono essere disattivati su determinati file system o da determinate opzioni di file system):
una "modifica" al file viene conteggiata come modifiche ai permessi, rinomina ecc. Mentre la modifica riguarda solo il contenuto.
Sebbene il ctime non sia tecnicamente il momento della creazione, abbastanza spesso lo è.
Poiché ctime non è influenzato dalle modifiche al contenuto del file, di solito viene aggiornato solo quando il file viene creato. E sì - posso sentirvi tutti urlare - viene aggiornato anche se modifichi i permessi di accesso o la proprietà ... ma generalmente è qualcosa che viene fatto una volta, di solito nello stesso momento in cui metti il file lì.
Personalmente uso sempre mtime per tutto, e immagino che sia quello che vuoi. Ma comunque ... ecco un rimaneggiamento della "poco attraente" bash di Guss, in una funzione facile da usare.
#! / Bin / bash function age () { nome file locale = $ 1 locale modificato = `stat -c% Y" $ nomefile "` local now = `date +% s` locale trascorso lasciare trascorso = ora cambiato echo $ trascorso } file = "/" echo L'età di $ file è $ (età "$ file") secondi.
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
superuser.com/questions/427551/…
chmod
, applicato sul file, annullerà quell'idea. Ma posso vivere con te facendo questo ;-)
+%s
secondo tempo
age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
Quell'età può essere molto più breve: (Grazie a @Grizly per la correzione!)
noatime
opzione (che è buono per le prestazioni, quindi dovresti usarlo). Quindi usa %X
invece di %Y
.
Il find è buono ma penso che tu possa usare un altro modo, soprattutto se hai bisogno di quanti secondi ha il file vecchio
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
utilizzando la data GNU
Considera il risultato dello strumento "stat":
File: `infolog.txt'
Size: 694 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 11635578 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ fdr) Gid: ( 1000/ fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800
Puoi vedere qui le tre date per Accesso / modifica / cambio. Non esiste una data di creazione. Puoi essere veramente sicuro solo quando il contenuto del file è stato modificato (il campo "modifica") o il suo inode cambiato (il campo "modifica").
Esempi di quando entrambi i campi vengono aggiornati:
"Modifica" verrà aggiornato se qualcuno ha concatenato informazioni aggiuntive alla fine del file.
"Modifica" verrà aggiornato se qualcuno ha cambiato i permessi tramite chmod.