Назад | Перейти на главную страницу

Удаление файлов с удаленного FTP-сервера старше x дней

У меня есть удаленный 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 и скоро.

Учитывая эти имена, вы можете просто переименовать предыдущие резервные копии перед загрузкой новой.

  • переименовать backup.2.tgz backup.3.tgz
  • переименовать backup.1.tgz backup.2.tgz
  • поставить backup.1.tgz

Вы должны уметь написать сценарий для:

  • Получите список файлов с помощью --list-only вариант curl
  • Проанализируйте список файлов, которые хотите удалить
  • Использовать --quote или --request возможность отправить rm или DELE команда с выбранными именами файлов

Редактировать:

Ваш второй цикл относится к $aFiles как скаляр. Вам нужно ссылаться на него как на такой массив:

for sFile in ${aFiles[@]}
do
        echo -e "\nFile:" $sFile
done

Кроме того, вам не нужен временный файл. Вы должны уметь трубить curl в while.

У меня похожая ситуация, и я вижу, что на нее еще нет полного ответа. Я понимаю, что эти 3 пункта являются вехами сценария:

  • Получите список файлов, используя параметр --list-only команды curl
  • Проанализируйте список файлов, которые хотите удалить
  • Используйте параметр --quote или --request, чтобы отправить команду rm или DELE с выбранными именами файлов.

и это очевидно. Но можем ли мы получить сценарий, который их выполняет?

Мои файлы имеют имена файлов, содержащие дату и время, когда они были созданы и загружены на удаленный 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, я продвигаюсь очень медленно, и пока что нашел только:

  • Я могу указать дату X дней назад: date -d "@ $ (($ (date +% s) - 86400 * $ XDays))"
  • Я могу перечислить все файлы с FTP-сервера: curl ftp: // [FTP_IP] / папка / подпапка /* --user MyUser @ [FTP_IP]: [MyUserPassword] --list-only "

Настоящий сценарий очень приветствуется.