使用 SCP/SFTP 删除远程服务器上超过 X 天的文件

使用 SCP/SFTP 删除远程服务器上超过 X 天的文件

有人知道一些使用 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

相关内容