Shell
重命名與目錄中特定 mtime 值匹配的文件
我每天使用一組簡單的 shell 命令來創建 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]
在這樣的腳本中很難處理(至少對我而言)。
您刪除舊備份的方法很好,在我看來比重命名文件更好。關於它的最醜陋的事情是長長的管道鏈,在您的範例中沒有什麼用,但會使線路太長。我會用這樣的塊來寫它
{ ... }
: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
.