2017-03-06 17 views
0

나는이 스크립트를 몇 달 전에 만들었으며, 매일 3 일 이상 된 백업 파일을 찾기 위해 매일 사용 해왔다. 3 일 또는 그 이상 생성 된 모든 파일을 신속하게 식별하는 데 도움이됩니다. 그것은 더 많은 사람이 읽을 수있는 방법으로 파일 몇살에 대한 코멘트와 함께 -l 명령 CLI에 LS의 결과가 표시됩니다디렉토리에있는 모든 파일의 길이를 표시하는 스크립트

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

. 예를 들어 :

나는 매일이 스크립트는 백업이 더 적은 3 일마다 수행되고 있는지 저를 신속하게 식별하지하는 데 도움이 매일 아침 사용
-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보다 크면 파일의 일 수와 함께 주석을 표시하지만 그 일은 스크립트에 음수 값이 표시되기 때문에 실제 날짜가 29 일, 30 일 또는 1 일에 가까워지면 몇 가지 문제가 있습니다. 예를 들면 다음과 같습니다.

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'이 달의 모두 일 수 있습니다을; '실제'가 * 이전 * 월에 발생했지만 한 달 전보다 작을 때'휴식'에 대한 음수 값을 얻습니다. – chepner

답변

0

당신은 절대 항목의 차이를 수행하는 달의 날짜를 사용하지만, 당신이 볼 수있는 개월의 현재 날짜가 이전개월에서 나중에 일보다 작은 경우, 그 실패합니다. 대신 파일이 마지막으로 수정 된 이후 경과 시간을 계산하기 위해 1970 년 1 일 이후의 시간 (초)을 측정하는 UNIX 타임 스탬프를 사용해야합니다. 또한이 정보를 얻으려면 ls 대신 stat을 사용하는 것이 좋습니다. (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

변수 "지금"은 무엇을 저장합니까? –

+0

죄송합니다, 나는'stat's을 혼란스럽게 만들었습니다. BSD'stat'에 대한 예제를 게시했습니다. 나는 또한'time'을'now'로 대체하려고했으나 완전히 그렇게하지 않았습니다. 두 문제는 모두 해결해야합니다. – 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