有人知道一些使用 SCP/SFTP 删除远程服务器上超过 X 天的文件的好方法吗?当然我可以用 perl 等编写一些脚本,但我觉得这有点大材小用。
有 UNIX 方法吗?
单行程序?
单独的实用程序?
谢谢
PS 任务是删除一些过时的备份文件。
答案1
这个问题很老了,但我仍然想添加我的 bash 专用解决方案,因为我来这里时正在寻找一个。 列表命令中的 grep tar 只是为了我自己的目的,只列出 tar 文件,当然可以进行调整。
RESULT=`echo "ls -t path/to/old_backups/" | sftp -i ~/.ssh/your_ssh_key [email protected] | grep tar`
i=0
max=7
while read -r line; do
(( i++ ))
if (( i > max )); then
echo "DELETE $i...$line"
echo "rm $line" | sftp -i ~/.ssh/your_ssh_key [email protected]
fi
done <<< "$RESULT"
这将删除给定目录中除最后 7 个之外的所有 tar 文件。虽然它不考虑日期,但如果您每天只有一个备份,那就足够了。
答案2
当然,我可以用 perl 等编写一些脚本,但这有点小题大做。
你不需要脚本来实现预期的效果 - 如果你有 shell 访问权限来发送命令,一行代码就可以了:
ssh user@host 'find /path/to/old_backups/* -mtime +7 -exec rm {} \;'
-mtime +7
匹配一周前当天午夜创建的文件。
答案3
如果您坚持使用 SCP/SFTP,您可以列出文件,使用简单的脚本解析它们并删除旧的备份文件。
批处理模式“-b”开关应该可以帮到你。它从文件中读取 sftp 命令。 http://linux.die.net/man/1/sftp
答案4
以上答案对我都不起作用。
尤其是当你受到密码限制并且无法使用私钥时安全FTP实用程序。
我找到了使用的好脚本lftp(要旨)。
您需要取消注释# STORE_DAYS=6
才能手动指定数量。
#!/bin/bash
# Simple script to delete files older than specific number of days from FTP. Provided AS IS without any warranty.
# This script use 'lftp'. And 'date' with '-d' option which is not POSIX compatible.
# FTP credentials and path
FTP_HOST="ftp.host.tld"
FTP_USER="usename"
FTP_PASS="password"
FTP_PATH="/ftp/path"
# Full path to lftp executable
LFTP=`which lftp`
# Enquery days to store from 1-st passed argument or strictly hardcode it, uncomment one to use
STORE_DAYS=${1:? "Usage ${0##*/} X, where X - count of daily archives to store"}
# STORE_DAYS=6
function removeOlderThanDays() {
# Make some temp files to store intermediate data
LIST=`mktemp`
DELLIST=`mktemp`
# Connect to ftp get file list and store it into temp file
${LFTP} << EOF
open ${FTP_USER}:${FTP_PASS}@${FTP_HOST}
cd ${FTP_PATH}
cache flush
cls -q -1 --date --time-style="+%Y%m%d" > ${LIST}
quit
EOF
# Print obtained list, uncomment for debug
# echo "File list"
# cat ${LIST}
# Delete list header, uncomment for debug
# echo "Delete list"
# Let's find date to compare
STORE_DATE=$(date -d "now - ${STORE_DAYS} days" '+%Y%m%d')
while read LINE; do
if [[ ${STORE_DATE} -ge ${LINE:0:8} && "${LINE}" != *\/ ]]; then
echo "rm -f \"${LINE:9}\"" >> ${DELLIST}
# Print files wich is subject to delete, uncomment for debug
#echo "${LINE:9}"
fi
done < ${LIST}
# More debug strings
# echo "Delete list complete"
# Print notify if list is empty and exit.
if [ ! -f ${DELLIST} ] || [ -z "$(cat ${DELLIST})" ]; then
echo "Delete list doesn't exist or empty, nothing to delete. Exiting"
exit 0;
fi
# Connect to ftp and delete files by previously formed list
${LFTP} << EOF
open ${FTP_USER}:${FTP_PASS}@${FTP_HOST}
cd ${FTP_PATH}
$(cat ${DELLIST})
quit
EOF
# Remove temp files
rm ${LIST} ${DELLIST}
}
removeOlderThanDays