2009-11-30 6 views
13

J'essaie de tester depuis combien de temps un fichier a été créé (en secondes) avec bash dans une instruction if. J'ai besoin de la date de création, pas de modification.Test d'une date de fichier avec bash

Avez-vous une idée de la façon de faire cela, sans utiliser une commande comme find avec grep?

+0

Il y a un certain nombre de commandes que vous pouvez utiliser pour ce faire et bash pouvez appeler tous. Pourquoi l'aversion à utiliser des commandes externes? UNIX a été construit sur la philosophie des outils en faisant une chose et une chose bien. – paxdiablo

+0

durera le temps de modification - ou avez-vous besoin de temps de création? – Joel

+0

Je préfère le temps de création – JeffPHP

Répondre

7

Voici la meilleure réponse que je trouve à l'instant, mais il est seulement pour le temps de modification:

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

avec% Z au lieu de% Y vous obtenez la dernière date de modification (date de création comme sur ma machine) –

18

Je crains cann't répondre à la question du temps de création, mais pour la dernière fois de modification vous pouvez utiliser ce qui suit pour obtenir la date de l'époque , en secondes, depuis nom était dernière modification:

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

alors vous pourriez donc quelque chose comme:

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 ..

Mise à jour Une façon plus elgant de le faire (encore une fois, le temps modifié uniquement): how do I check in bash whether a file was created more than x time ago?

1

vous pouvez utiliser ls avec --full temps

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 votre système a stat:

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

Et vous pouvez faire le calcul comme dans Joel La réponse.