У меня есть удаленный FTP-сервер, на котором я храню резервные копии через cronjob.
Проблема в том, что у меня мало места, поэтому я делаю инкрементное резервное копирование. Я хочу хранить резервные копии около 14 дней.
У меня нет другого доступа к серверу, кроме FTP, и теперь я не знаю, как удалять файлы старше x дней. У каждого файла есть имя с датой в нем
yxzNamezxy-date-y-m-d.tar.bz2 (datev-20100111.tar.bz2(
Надеюсь получить здесь помощь.
Приветствую и спасибо за многообещающие ответы,
Деннис
/Редактировать
Я пытаюсь использовать завиток, который упоминается в ответе с этой частью кода
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
но цикл secound не дает мне более одного имени файла
Привет,
Деннис
Вы можете отправить серию команд на lftp
и оберните его в сценарий оболочки, который вычисляет имена слишком старых файлов (см. сценарий ниже).
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
Имея высокий риск быть отклоненным за то, что разместили поздний комментарий в этой ветке, вот вам идея.
Если вам не нужны даты в именах файлов и если вы храните небольшое управляемое количество резервных копий, вы можете использовать порядковые имена файлов: например, backup.1.tgz, backup.2.tgz, backup.3.tgz и скоро.
Учитывая эти имена, вы можете просто переименовать предыдущие резервные копии перед загрузкой новой.
Вы должны уметь написать сценарий для:
--list-only
вариант curl
--quote
или --request
возможность отправить rm
или DELE
команда с выбранными именами файловРедактировать:
Ваш второй цикл относится к $aFiles
как скаляр. Вам нужно ссылаться на него как на такой массив:
for sFile in ${aFiles[@]}
do
echo -e "\nFile:" $sFile
done
Кроме того, вам не нужен временный файл. Вы должны уметь трубить curl
в while
.
У меня похожая ситуация, и я вижу, что на нее еще нет полного ответа. Я понимаю, что эти 3 пункта являются вехами сценария:
и это очевидно. Но можем ли мы получить сценарий, который их выполняет?
Мои файлы имеют имена файлов, содержащие дату и время, когда они были созданы и загружены на удаленный FTP-сервер:
xxx.yyy.z.aaa_01_20160313102903_DUMP01.dmp
Позиция даты и времени (например, 20160313102903) в имени файла статична. Конечно, временные метки этих файлов также действительны.
Моя цель - удалить файлы старше X дней с помощью сценария, который должен запускаться в cron на Linux-машине, где я могу использовать только curl или lftp.
Я не могу использовать какой-либо другой протокол, кроме ftp, для доступа к FTP-серверу (без sftp, без ssh)
Я не могу использовать команду date с синтаксисом «X days ago» или «--iso», так как эта Linux-машина работает под управлением BusyBox v1.20.2 (2015-01-30 16:18:45 WET), который не понимает человеческую дату Ссылки
Я не могу создать временные подпапки на этом FTP-сервере
Я искал сценарии, которые должны привести меня к решению, но поскольку я linux noob, я продвигаюсь очень медленно, и пока что нашел только:
Настоящий сценарий очень приветствуется.