Удалить файлы старше 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