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 -cminper la modifica o -aminper il tempo di accesso. Come altri hanno sottolineato, non credo che tu possa tenere traccia del tempo di creazione.
findrestituisse un valore diverso da zero quando non vengono trovate corrispondenze.
text.txtsi presume che non sia una directory.
[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Mi è sempre piaciuto usare date -r /the/file +%sper trovare la sua età.
Puoi anche farlo touch --date '2015-10-10 9:55' /tmp/fileper 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 statper capire la data dell'ultima modifica del file, dateper 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 findrispetto all'approccio, penso che sia un approccio migliore rispetto a correre finda guardare un file che hai già "trovato". Inoltre, la manipolazione della data è divertente ;-)
%Zinvece di %Ysotto per ottenere "l'ora di modifica" che potrebbe essere quella che desideri.[Aggiornare]
Per gli utenti Mac, utilizzare al stat -f "%m" $somefileposto della sintassi specifica per Linux sopra
statnon è 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 ;-)
+%ssecondo tempo
age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); } Quell'età può essere molto più breve: (Grazie a @Grizly per la correzione!)
noatimeopzione (che è buono per le prestazioni, quindi dovresti usarlo). Quindi usa %Xinvece 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.