2017-03-06 14 views
0

J'ai créé ce script il y a quelques mois, je l'utilise tous les jours pour savoir quels fichiers de sauvegarde ont plus de 3 jours ou plus. cela m'aide à identifier rapidement tous les fichiers qui ont 3 jours ou plus de création.Script pour montrer l'âge de tous les fichiers dans un répertoire

#!/bin/bash 
#Backup 
time=$(date +%d)  #Current time in days 
a=3      #Number of the past days 
b=0      #No need to verify it because it has a backup from today 
     echo 
     ls -l | tail -n +2 | while read result; 
     do 
     echo $result | awk -vC0='\033[0;0m' -vC1='\033[0;32m' -vC2='\033[0;31m' -vC3='\033[0;33m' \ 
     '{printf "%+10s %+1s %-5s %+4s %+4s %+3s %+2s %5s %-20s \n", $1,$2,$3,$4,$5,$6," " C1 $7 C0," " $8," " $9}' 
     actual=$(echo $result | awk '{ print $7 }') 
     partition=$(echo $result | awk '{ print $9 }') 
     rest=$(($time-$actual)) 
if [[ $rest -le $a && $rest -ne $b ]]; then 
     echo -e "\t The Backup for \e[33m$partition\e[0m was done \e[33m$rest\e[0m days ago" 
fi 
     done 

Il affiche sur la CLI les résultats de la commande ls -l avec un commentaire sur la façon dont les fichiers sont vieux d'une manière plus lisible humaine. Par exemple:

-rw-r--r-- 1 root root 98756181 Mar 7 23:59 server005.Mon.tgz 
     The Backup for server005.Mon.tgz was done 3 days ago 
-rw-r--r-- 1 root root 23663925 Mar 3 18:00 server006.Fri.tgz 
     The Backup for server006.Fri.tgz was done 3 days ago 
-rw-r--r-- 1 root root 23663925 Mar 3 18:00 server009.Mon.tgz 
     The Backup for server009.Mon.tgz was done 3 days ago 

J'utilise ce script par jour chaque matin, il me aide à identifier rapidement si les sauvegardes sont effectuées tous les 3 jours pas moins, le script affiche un commentaire dans chaque fichier montrant à quel âge le fichier est par en utilisant la date actuelle (en jours) des fichiers moins la date de création du fichier (en jours), puis si le résultat est supérieur au numéro 3, il affichera un commentaire avec le nombre de jours d'un fichier, mais la chose est que J'ai quelques problèmes lorsque la date réelle est proche du 29, du 30 ou du 1er jour du mois, car les scripts affichent des valeurs négatives. Par exemple:

The Backup for backupserver001.Thu.tgz was done -11 days ago 
The Backup for backupserver002.Wed.tgz was done -10 days ago 
The Backup for backupserver003.Mon.tgz was done -21 days ago 

Comme je l'ai dit, cela se produit uniquement lorsque la date actuelle est proche de la fin ou du début d'un mois.

Je ne suis pas très doué en programmation ou en maths, c'est pourquoi je cherche de l'aide ici. Je suis sûr que cette tâche peut être accomplie d'une manière bien meilleure, plus simple, mon code est vraiment en désordre. Toute aide sera vraiment appréciée.

+0

'' time' et actual' sont tous les deux jours du mois; vous obtenez une valeur négative pour 'repos' quand' effective' survient dans le mois précédent, mais moins d'un mois. – chepner

Répondre

0

Vous utilisez le jour d'un mois pour effectuer des différences de point absolu, mais comme vous pouvez le voir, qui ne réussit pas quand le jour actuel de ce mois-ci est moins d'un jour plus tard dans le mois précédent . Vous devriez plutôt utiliser un horodatage UNIX, qui mesure le nombre de secondes écoulées depuis un jour en 1970, pour calculer le temps écoulé depuis la dernière modification d'un fichier. Aussi, je recommande d'utiliser stat, plutôt que ls, pour obtenir cette information. (GNU stat suppose, votre mise en œuvre locale peut varier.)

#!/bin/bash 
#Backup 
now=$(date +%s)  #Current time in seconds since Jan 1 1970 
a=3      #Number of the past days 
b=0      #No need to verify it because it has a backup from today 
echo 
for f in *; do  
    actual=$(stat -c '%Y') 
    rest=$(((now - actual)/84600)) 
    if ((rest < a && rest != b)); then 
    printf '\t The Backup for \033[33m%s\033[0m was done \033[m%d\033[0m days ago\n' "$f" "$rest" 
done 
+0

J'ai essayé avec stat il y a longtemps, mais ça ne m'a rien donné. Je reçois une erreur que je ne comprends pas. Pouvez-vous m'aider avec celui-ci: stat: impossible de lire les informations du système de fichiers pour '% Y': aucun fichier ou répertoire de ce type. J'ai corrigé quelques choses comme pour f dans/home/admin/Documents/*; et ajouté le fi avant le fait. –

+0

aussi qu'est-ce que la variable "maintenant" stocke? –

+0

Désolé, j'ai eu mon 'stat's confus; J'ai posté un exemple pour BSD 'stat'. Je voulais aussi remplacer 'time' par' now', mais je ne l'ai pas fait complètement. Les deux problèmes devraient être corrigés maintenant. – chepner

0

Après @chepner m'a aidé, j'ai pu améliorer le script, il exécute maintenant la tâche d'une manière beaucoup mieux.

#!/bin/bash 

#Backup 

time=$(date +%s)  #Current time in seconds since Jan 1 1970 
a=3      #Number of the past days 

echo 
    printf '\t \t \033[32mBACKUPS \tBACKUPS \tBACKUPS \tBACKUPS \tBACKUPS \tBACKUPS \tBACKUPS \tBACKUPS \033[0m \n \n' 
for f in /home/admin/Documents/*; 
do 
    actual=$(stat -c '%Y' $f) 
    normal=$(stat -c '%y' $f) 
    rest=$(((time - actual)/84600)) 
    if ((rest > a)); then 
    printf '\t Backup for \033[33m%-40s\033[0m was done \033[1;31m%d\033[0m days ago. \t Created Date: \033[0m%-30s \n' "$f" "$rest" "$normal" 
else 
    printf '\t Backup for \033[33m%-40s\033[0m was done \033[1;32m%d\033[0m days ago. \t Created Date: \033[0m%-30s \n' "$f" "$rest" "$normal" 
fi 
done 
echo 

La sortie est plus claire et organiser, ce qui rend plus facile d'identifier tout problème:

    BACKUPS  BACKUPS   BACKUPS   BACKUPS   BACKUPS   BACKUPS   BACKUPS   BACKUPS 

     Backup for /home/admin/Documents/backup_full.sh  was done 36 days ago.  Created Date: 2017-01-30 15:26:46.217390547 -0500 
     Backup for /home/admin/Documents/backup.sh   was done 0 days ago.  Created Date: 2017-03-07 15:07:17.066182193 -0500 
     Backup for /home/admin/Documents/English.xlsx  was done 36 days ago.  Created Date: 2017-01-30 15:25:37.592965894 -0500 
     Backup for /home/admin/Documents/MySQL.docx   was done 36 days ago.  Created Date: 2017-01-30 15:25:37.604965969 -0500 
     Backup for /home/admin/Documents/accounts.txt  was done 36 days ago.  Created Date: 2017-01-30 15:25:37.628966117 -0500 
     Backup for /home/admin/Documents/SGID.docx   was done 36 days ago.  Created Date: 2017-01-30 15:25:37.604965969 -0500 
     Backup for /home/admin/Documents/sticky_bit.docx was done 36 days ago.  Created Date: 2017-01-30 15:25:37.616966043 -0500 
     Backup for /home/admin/Documents/SUID.docx   was done 36 days ago.  Created Date: 2017-01-30 15:25:37.576965795 -0500 
     Backup for /home/admin/Documents/test.sh   was done 1 days ago.  Created Date: 2017-03-06 12:23:46.872273977 -0500