我有一个远程 FTP 服务器,我通过 cronjob 在其中存储一些备份。
问题是我只有少量空间,所以我进行增量备份。我想保留大约 14 天的备份。
除了 FTP,我没有任何其他访问服务器的权限,而且我不知道如何删除超过 x 天的文件。每个文件都有一个名称,其中包含日期
yxzNamezxy-date-y-m-d.tar.bz2 (datev-20100111.tar.bz2(
希望在这里得到一些帮助。
欢呼并感谢您即将给出的答案,
丹尼斯
/编辑
我正在尝试使用在答案中提到的 curl 来处理这部分代码
curl ftp://$FTP_SERVER --user $FTP_USER:$FTP_PASS --list-only > files.tmp
declare -a aFiles
let iCount=0
exec < files.tmp
while read sLine
do
aFiles[$iCount]=$sLine
((iCount++))
done
echo -e "\n Files: \n\n\n"
echo ${aFiles[@]}
echo -e "\nfor ...\n\n\n"
for sFile in $aFiles
do
echo -e "\nFile:" $sFile
done
但第二个循环不会给我超过 1 个文件名
干杯,
丹尼斯
答案1
您可以发送一系列命令并将lftp
其包装在 shell 脚本中,该脚本可以计算太旧的文件的文件名(请参阅下面的脚本)。
TODAY=$(date --iso) # Today's date like YYYY-MM-DD
RMDATE=$(date --iso -d '6 days ago') # TODAY minus X days - too old files
FTPUSER=username
FTPPW=password # Better load this from an encrypted file
FTPSERVER=FQDN_or_IP
LFTP=/usr/bin/lftp # Path to binary
TMPDIR=$(mktemp -d) # Your archives are here
# CAUTION: mput -E deletes local files after upload
echo -n "Uploading files via FTP... "
$LFTP << EOF
open ${FTPUSER}:${FTPPW}@${FTPSERVER}
cd backups/${HOSTNAME}
mkdir ${TODAY}
cd ${TODAY}
mput -E ${TMPDIR}/*
cd ..
rm -rf ${RMDATE}
bye
EOF
echo "Done."
确保除了你之外没有人root
可以读取此脚本或将凭据放在其他地方。TMPDIR
是备份本地所在的目录。当然,你需要编辑明显的部分。
HTH,
PEra
答案2
由于在此主题上发表迟来的评论而面临被否决的高风险,因此这里有一个想法。
如果您不介意文件名中的日期,并且只保留少量可管理的备份,则可以使用序数文件名:即 backup.1.tgz、backup.2.tgz、backup.3.tgz 等等。
有了这些名称,您可以在上传新的备份之前简单地重命名以前的备份。
- 重命名备份.2.tgz备份.3.tgz
- 重命名备份.1.tgz备份.2.tgz
- 放入备份.1.tgz
答案3
您应该能够编写一个脚本来:
--list-only
使用以下选项获取文件列表curl
- 解析要删除的文件列表
- 使用
--quote
或--request
选项发送带有选定文件名的rm
或命令DELE
编辑:
您的第二个循环引用的是$aFiles
标量。您需要将其引用为数组,如下所示:
for sFile in ${aFiles[@]}
do
echo -e "\nFile:" $sFile
done
另外,您不需要临时文件。您应该能够curl
通过管道传输while
。