2017-03-06 63 views
0

几个月前我创建了这个脚本,我每天都在使用它来查明哪些备份文件超过3天或更长时间。它可以帮助我快速识别所有具有3天或更长时间创建的文件。脚本显示目录中的所有文件的年龄

#!/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 

它将与评论一起显示在CLI LS的结果-l命令怎么老在一个更加人性化可读的方式的文件。例如:

-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 

我使用这个脚本每天每天早上,这样有助于我快速确定备份正在每3天做了不少,脚本将显示在每个文件显示文件几岁是评论使用文件的当前日期(以天为单位)减去文件的创建日期(以天为单位),然后如果结果大于数字3,它将显示带有文件天数的评论,但事实是当真实日期接近每月的第29,30或第一天时,我遇到一些问题,因为脚本显示负值。例如:

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 

就像我说的,这只发生在当前日期接近月底或月初时。

我对编程或数学不太擅长,所以这就是我在这里寻找帮助的原因。我很确定这个任务可以以更好的方式完成,更简单,我的代码非常混乱。任何帮助将非常感激。

+0

'time'和'actual'是该月的两日;当'actual'发生在* previous *月份,但不满一个月前时,你会得到'rest'的负值。 – chepner

回答

0

您使用的是一个月的天数以执行绝对项的差异,但你可以看到,当这个个月的当前日期是小于以后的日子在以前个月失败。您应该使用UNIX时间戳来计算自上次修改文件以来的经过时间,该时间戳测量自1970年以来的秒数。此外,我建议使用stat而不是ls来获取此信息。 (GNU stat假设;当地实施可能会有所不同。)

#!/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

很久以前我用stat去试过,但它让我无处可去。我收到一个我不明白的错误。你能帮我解决这个问题:stat:无法读取'%Y'的文件系统信息:没有这样的文件或目录。我在/ home/admin/Documents/*中修正了几个例如f的问题;并在完成之前添加了fi。 –

+0

变量“now”存储的是什么? –

+0

对不起,我弄错了'统计';我发布了一个BSD'stat'的例子。我也打算用'now'替换'time',但并没有完全做到这一点。这两个问题现在应该解决。 – chepner

0

@chepner帮我之后,我能够增强脚本,现在它在执行一个更好的方法任务。

#!/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 

输出更加组织和清晰,使易于识别任何问题:

    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 
相关问题