Shell

重命名與目錄中特定 mtime 值匹配的文件

  • March 23, 2016

我每天使用一組簡單的 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.

引用自:https://unix.stackexchange.com/questions/45015