저는 매일 간단한 쉘 명령 세트를 사용하여 mysqldump를 생성합니다. 이 스크립트는 cron 데몬에 의해 호출됩니다. 다음과 같이 보입니다:
presentdate="`date +%d-%m-%Y_%H:%M.%S`"
basedir="/var/db_my_backup"
mysqldump -u username -ppassword --all-databases |
gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz |
find -L $basedir/'*' -type f -mtime +7 exec rm -f {} \; |
chown -R user:group $basedir | (
cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz.
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
cat
) | /bin/mail -s "Report from scheduled job for mysqldumps" root
내 관심사는: 어떻게 하면 더 우아하게 만들 수 있을까? 7일이 지난 파일을 선택하고 이름을 바꾸는 기능을 구축할 수 있습니까? 나는 다음과 같은 이상한 경고를 생성하기 때문에 find를 사용하는 것을 좋아하지 않습니다.
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]
이와 같은 스크립트에서는 (적어도 나에게는) 다루기가 어렵습니다.
답변1
오래된 백업을 삭제하는 방법은 훌륭하고 제 생각에는 파일 이름을 바꾸는 것보다 낫습니다. 가장 추악한 것은 긴 파이프 체인으로, 귀하의 예에서는 거의 사용되지 않지만 선을 너무 길게 만듭니다. { ... }
다음과 같은 블록을 사용하여 작성 하겠습니다 .
presentdate="`date +%d-%m-%Y_%H:%M.%S`"
basedir="/var/db_my_backup"
{
mysqldump -u username -ppassword --all-databases | gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz
find -L $basedir/'*' -type f -mtime +7 -exec rm -v {} \;
chown -vR user:group $basedir
cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz.
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
} 2>&1 | /bin/mail -s "Report from scheduled job for mysqldumps" root
마지막 2>&1
부분에는 이메일에 오류 출력이 포함되어 있으며 원하지 않는 경우 삭제할 수 있습니다. 또한 자세한 내용을 위해 몇 가지 플래그를 추가했습니다 -v
.
댓글 작성자가 말했듯이 find
올바르게 사용하면 이상한 오류가 발생하지 않습니다. 매개변수에 문제가 있습니다 . 대신 find
사용하세요 . 올바른 매개변수를 얻으려면 다음을 읽어보세요 .exec
-exec
man find