2011-05-23 2 views
5

Je développe un script bash qui a besoin de rechercher des fichiers dans un seul répertoire qui sont "vieux" basé sur une variable qui spécifie combien de jours doivent passer avant le seuil est dépassé et les fichiers sont marqués pour l'action (peut-être quelque chose de passer à l'archive à supprimer, etc ...). Le hic, c'est que l'heure de modification du fichier n'est pas pertinente pour déterminer l'ancienneté des fichiers avant d'agir, car les fichiers peuvent être rarement modifiés, le temps d'exécution du script peut varier, etc.script bash pour trouver les anciens fichiers basés sur la date dans le nom de fichier

L'heure qui détermine la conservation des fichiers se trouve dans le nom du fichier sous la forme AAAA-MM-JJ (ou% F avec la commande date). Prenez par exemple le nom de fichier contents-2011-05-23.txt. Quelles commandes pourraient être exécutées dans ce répertoire pour trouver tous les fichiers qui dépassent un certain nombre de jours (j'ai le seuil actuellement fixé à 7 jours, pourrait changer) et imprimer leurs noms de fichiers?

Répondre

2

Dans BSD, le -j est utilisé pour empêcher la fixation de la date et le paramètre -f est utilisé pour définir le format de la date d'entrée. :

D'abord, vous devez trouver la date d'aujourd'hui dans le nombre de jours depuis le 1er Janvier, 1970:

today=$(date -j -f "%Y-%m-%d" 1969-12-31 +%s) 

Maintenant, vous pouvez l'utiliser pour savoir le temps il y a sept jours:

((cutoff = $today - 604800)) 

Le nombre 604800 est le nombre de secondes en sept jours. Maintenant, pour chaque fichier dans votre répertoire, vous devez trouver la partie date de la chaîne. Je ne connais pas de meilleur moyen. (Peut-être que quelqu'un connaît une magie Bash).

find . -type f | while read fileName 
do 
    fileDate=$(echo $foo | sed 's/.*-\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/') 
    yadda, yadda, yadda #Figure this out later 
done 

Une fois que nous avons la date du fichier, nous pouvons utiliser la commande date pour savoir si cette date en quelques secondes en moins (et donc plus ancienne que la date limite)

today=$(date -j -f "%Y-%m-%d" 1969-12-31 +%s) 
((cutoff = $today - 604800)) 
find . -type f | while read fileName #Or however you get all the file names 
do 
    fileDate=$(echo $foo | sed 's/.*-\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/') 
    fileDateInSeconds=$(date -j -f "%Y-%m-%d" $fileDate +%s) 
    if [ $fileDateInSeconds -lt $cutoff ] 
    then 
      rm $fileName 
    fi 
done 

Dans Linux, vous utilisez le paramètre -d pour définir la date qui doit être dans le format YYYY-MM-DD:

today=$(date +"%Y-%m-%d) 

maintenant, vous pouvez prendre cela et trouver le nombre de secondes:

todayInSeconds=(date -d $today +%s) 

Tout le reste devrait être plus ou moins le même que ci-dessus.

0

Si vous exécutez la commande par jour, vous pouvez le faire:

echo *-`date -d '8 days ago' '+%F'`.txt 

wildcards supplémentaires pourraient être ajoutées ofcourse

5

Créer un script bash isOld.sh comme ceci:

#!/bin/bash 

fileName=$1 
numDays=$2 

fileDt=$(echo $fileName | sed 's/^[^-]*-\([^.]*\)\..*$/\1/') 
d1=$(date '+%s') 
d2=$(date -d $fileDt '+%s') 
diff=$((d1-d2)) 
seconds=$((numDays * 24 * 60 * 60)) 
[[ diff -ge seconds ]] && echo $fileName 

Ensuite, donnez l'autorisation d'exécution au fichier ci-dessus en exécutant:

chmod +x ./isOld.sh 

Et enfin exécuter cette commande trouver du haut de votre répertoire pour imprimer des fichiers de plus de 7 jours comme:

find . -name "contents-*" -exec ./isOld.sh {} 7 \; 
+0

+1 Difficile à battre – leonbloy

0
find *[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]*.txt -exec bash -c 'dt=`echo $0 | sed -re "s/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/"`; file_time=`date -d $dt +%s`; cutoff_time=`date -d "31 days ago" +%s` ; test $file_time -lt $cutoff_time ' {} \; -print 

C'est l'une de mes plus long liners :-) Ici, il est emballé à nouveau:

find *[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]*.txt \ 
    -exec bash -c ' dt=`echo $0 | \ 
        sed -re "s/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/"`; \ 
        file_time=`date -d $dt +%s`; \ 
        cutoff_time=`date -d "31 days ago" +%s` ;\ 
        test $file_time -lt $cutoff_time \ 
       ' {} \; -print 
Questions connexes