我正在尝试在我的脚本中添加一种方法来删除 3 天前之前的备份。
请参阅下面的精简简化版本,仅留下移除部分。
据我了解,${BACKUP_DEST[$i]}/$OLDBACKUP
应该输出类似“/Users/christopherdavies/Desktop/rsync/test1.co.uk/07-06-18”的内容。
但是,每次运行时,它都会删除上面的“test1.co.uk”文件夹,无论它是否已经存在 3 天。
有人能指出我正确的方向吗?我一直没能取得任何进展……一双新的眼睛?
#!/bin/sh
WEBSITE_HOST=(
"[email protected]"
"[email protected]"
)
BACKUP_DEST=(
"/Users/christopherdavies/Desktop/rsync/test1.co.uk"
"/Users/christopherdavies/Desktop/rsync/test2.co.uk"
)
OLDBACKUP=`date -d "3 days ago" +"%d%m%Y"`
SITE_COUNT=${#WEBSITE_HOST[@]}
for (( i = 0; i < SITE_COUNT; i++ )); do
# Remove old backups
if [ -d "${BACKUP_DEST[$i]}/$OLDBACKUP" ]; then rm -Rf ${BACKUP_DEST[$i]}/$OLDBACKUP; fi
done
exit 0
答案1
macOS 上的实用程序date
(从用户主目录的位置来看,我认为您正在使用它)不是 GNU date
,因此不支持其所有功能。
这意味着您的OLD_BACKUP
变量将为空(运行时您应该看到一条错误消息date
),这又意味着它是${BACKUP_DEST[$i]}
被删除的目录。
相反,您可以使用date -v -3d +'%d-%m-%Y'
.
#!/bin/bash
set -e
backup_dest=(
'/Users/christopherdavies/Desktop/rsync/test1.co.uk'
'/Users/christopherdavies/Desktop/rsync/test2.co.uk'
)
when=$( date -v -3d +'%d-%m-%Y' )
for backup in "${backup_dest[@]}"; do
[ -d "$backup/$when" ] && rm -Rf "$backup/$when"
done
或者,安装 GNU coreutils 并使用 GNU date
。
对您的代码所做的其他更改:
exit 0
从末尾删除并添加set -e
.如果脚本失败,您将希望能够注意到它。未使用网站数组。
循环遍历数组中的项目而不是使用索引,这样更容易阅读。
如果您想要单行简单
if
语句,您可以使用短路语法(更短)。使用小写变量名。
始终引用变量扩展。
这是一个
bash
脚本,所以它应该bash
在#!
-line 上引用。