Удалить файлы старше X дней на удаленном сервере с SCP/SFTP

Кто-нибудь знает какой-нибудь хороший способ удалить файлы на удаленном сервере старше X дней, используя только SCP/SFTP? Конечно, я могу написать какой-нибудь скрипт на Perl и т.д., но я чувствую, что это излишне.
Любой способ UNIX?
Один лайнер?
Отдельная утилита?

Спасибо

PS Задача состоит в том, чтобы удалить несколько устаревших файлов резервных копий.

4 ответа

Решение

Этот вопрос очень старый, но я все еще хотел добавить свое решение только для bash, так как я просто искал его, когда приехал сюда. Grep tar в команде list предназначен только для моей собственной цели, чтобы вывести список только tar-файлов, конечно, может быть адаптирован.

RESULT=`echo "ls -t path/to/old_backups/" | sftp -i ~/.ssh/your_ssh_key user@server.de | 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 user@server.de
    fi
done <<< "$RESULT"

При этом удаляются все файлы tar в данном каталоге, кроме последних 7. Хотя дата не учитывается, но если у вас есть только одна резервная копия в день, это достаточно хорошо.

Конечно, я могу написать какой-нибудь скрипт на Perl и т.д., но это излишне.

Вам не нужен сценарий для достижения желаемого эффекта - однострочный будет делать, если у вас есть доступ к оболочке для отправки команды:

ssh user@host 'find /path/to/old_backups/* -mtime +7 -exec rm {} \;'

-mtime +7 сопоставляет файлы, созданные неделю назад с полуночи настоящего дня.

Если вы настаиваете на SCP/SFTP, вы можете перечислять файлы, анализировать их с помощью простого сценария и удалять старые файлы резервных копий.

Переключатель пакетного режима "-b" должен помочь вам. Он читает команды sftp из файла. http://linux.die.net/man/1/sftp

Из приведенных выше ответов мне ничего не помогло.
Особенно, если вы ограничены паролем и не можете использовать закрытый ключ для утилиты sftp .
Я нашел хороший сценарий, использующий lftp (суть ).

Вам нужно раскомментироватьуказать количество вручную.

      #!/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
Другие вопросы по тегам