我使用 bash 創建了一個 cron 來洗掉超過 3 天的檔案,但是當使用 mtime 3 &> /dev/null 檢查檔案的年齡時,它總是錯誤的。這是腳本:
now=$(date)
create log file
file_names=('*_takrib_golive.gz' '*_takrib_golive_filestore.tar.gz')
touch /media/nfs/backup/backup_delete.log
echo "Date: $now" >> /media/nfs/backup/backup_delete.log
for filename in "${file_names[@]}";
do
echo $filename
if ls /media/nfs/backup/${filename} &> /dev/null
then
echo "backup files exist"
if find /media/nfs/backup -maxdepth 1 -mtime 3 -name ${filename} -ls &> /dev/null
then
echo "The following backup file was deleted" >> /media/nfs/backup/backup_delete.log
find /media/nfs/backup -maxdepth 1 -mtime 3 -name ${filename} -delete
else
echo "There are no ${filename} files older than 3 days in /media/nfs/backup" &>> /media/nfs/backup/backup_delete.log
fi
else
echo "No ${filename} files found in /media/nfs/backup" >> /media/backup/backup_delete.log
fi
done
exit 0
inif find /media/nfs/backup -maxdepth 1 -mtime 3 -name ${filename} -ls &> /dev/null總是轉到 else,即使目錄中存在超過 3 天的檔案
uj5u.com熱心網友回復:
您沒有參考該-name屬性,因此它會擴展為已存在的檔案的名稱。
無論如何,我會相當廣泛地重構這個。不要決議ls輸出,也許可以通過使何時參考和何時不參考更明顯來簡化這一點。
未經測驗,但希望仍然有用:
#!/bin/bash
backup=/media/nfs/backup
backuplog=$backup/backup_delete.log
# no need to touch if you write to the file anyway
date "Date: %C" >> "$backuplog"
# Avoid using a variable, just loop over the stems
for stem in takrib_golive takrib_golive_filestore.tar
do
# echo $filename
# Avoid parsing ls; instead, loop over matches
for filename in "$backup"/*_"$stem".gz; do
pattern="*_$stem.gz"
if [ -e "$filename" ]; then
echo "backup files exist"
if files=$(find "$backup" -maxdepth 1 -mtime 3 -false -o -name "$pattern" -print -delete)
then
echo "The following backup file was deleted" >> "$backuplog"
echo "$files" >> "$backuplog"
else
echo "There are no $pattern files older than 3 days in $backup" >> "$backuplog"
fi
else
echo "No $pattern files found in $backup" >> "$backuplog"
fi
# Either way, we can break the loop after one iteration
break
done
done
# no need to explicitly exit 0
for if [ -e ... ]排列有點笨拙,但這就是您檢查通配符是否匹配任何檔案的方式。如果通配符不匹配,if [ -e 將檢查名稱實際上是通配符運算式本身的檔案,并失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512819.html
標籤:linux重击壳cron
下一篇:合并兩個檔案AWK
