2009-11-30 26 views
13

Estoy intentando comprobar la antigüedad de un archivo creado (en segundos) con bash en una declaración if. Necesito la fecha de creación, no la modificación.Probar una fecha de archivo con bash

¿Tiene alguna idea de cómo hacer esto, sin usar un comando como find con grep?

+0

Hay una serie de comandos que se pueden utilizar para hacer esto y bash puede llamar a todos ellos. ¿Por qué la aversión a usar comandos externos? UNIX fue construido sobre la filosofía de las herramientas haciendo una cosa y una cosa bien. – paxdiablo

+0

durará el tiempo de modificación, o ¿necesita tiempo de creación? – Joel

+0

Prefiero el tiempo de creación – JeffPHP

Respuesta

7

Aquí es la mejor respuesta que encontré en el momento, pero es sólo por el tiempo de modificación:

expr `date +%s` - `stat -c %Y /home/user/my_file` 
+0

con% Z en vez de% Y obtienes la última fecha de cambio (fecha de creación como en mi máquina) –

18

Me temo que cann't responder a la pregunta por el tiempo de creación, pero para la última fecha de modificación se puede utilizar el siguiente para obtener la fecha época, en segundos, ya que el nombre de archivo fue modificado por última vez :

date --utc --reference=filename +%s 

por lo que podría a continuación, así que algo como:

modsecs=$(date --utc --reference=filename +%s) 
nowsecs=$(date +%s) 
delta=$(($nowsecs-$modsecs)) 
echo "File $filename was modified $delta secs ago" 

if [ $delta -lt 120 ]; then 
    # do something 
fi 

etc ..

actualización Una forma más elgant de hacer esto (de nuevo, sólo el tiempo modificado): how do I check in bash whether a file was created more than x time ago?

1

puede utilizar ls con tiempo --full

file1="file1" 
file2="file2" 
declare -a array 
i=0 
ls -go --full-time "$file1" "$file2" | { while read -r a b c d time f 
do  
    time=${time%.*} 
    IFS=":" 
    set -- $time 
    hr=$1;min=$2;sec=$3 
    hr=$((hr * 3600)) 
    min=$((min * 60)) 
    totalsecs=$((hr+min+sec)) 
    array[$i]=$totalsecs 
    i=$((i+1)) 
    unset IFS  
done 
echo $((${array[0]}-${array[1]})) 
} 
2

Si el sistema dispone de stat:

modsecs=$(stat --format '%Y' filename) 

Y usted puede hacer los cálculos como en Joel la respuesta.

Cuestiones relacionadas