Nano Hash - криптовалюты, майнинг, программирование

Удалить файлы в подкаталогах через SFTP без SSH старше недели

Контекст

В настоящее время я отправляю данные на SFTP-сервер, который другие процессы и системы используют для дальнейших действий. Все файлы имеют общую корневую папку, но они подразделяются на подпапки в соответствии с определенными категориями. Эта структура папок не должна изменяться и не может быть изменена. По истечении определенного периода времени (в настоящее время 7 дней) мне нужно автоматически удалить эти файлы.

К сожалению, сервер имеет строгие права доступа, и я могу получить доступ только к определенному каталогу через SFTP; SSH и т. д. запрещены. Проблема в таком автоматизированном процессе заключается в следующих ограничениях:

  • Только SFTP-протокол
  • Никакие изменения в логике папок не допускаются; старые и новые файлы должны находиться в одних и тех же каталогах
  • Команду SFTP необходимо выполнить из задания CRON. Таким образом, SFTP-команды должны обрабатываться как однострочные.
  • Ничего нельзя установить/изменить на SFTP-сервере

Пока я знаю, что могу удалять файлы в одну строку следующим образом:

echo "rm $_file_name" | sftp $username@$sftp_server

Однако проблема, с которой я больше всего борюсь, - это чтение файлов на SFTP-сервере в одну строку и фильтрация этого вывода по критерию даты.

Вопрос

Как я могу выполнить задание CRON, удаляющее файлы только через SFTP в каталоге, если они старше недели?


Примечание. Мне известны такие вопросы, как здесь и здесь; во всяком случае, они не разделяют ограничений, которые есть у меня.

13.04.2021

Ответы:


1

Через некоторое время я нашел решение в процессе пошагового обучения:

Шаг 1. Получение всех подкаталогов

Сначала мне нужно было получить все каталоги, в которых хранятся файлы. Учитывая предположение, что все соответствующие каталоги являются подкаталогами \IN, мое решение состояло в том, чтобы получить String-возврат для этой информации и выполнить итерацию по разделенной `String.

# Get the string the sftp-command returns for listing all directories in /IN.
sftp_dirs=$(echo $(echo ls | sftp $username@$sftp_server:/IN))

# Then erase the log-information from that string sftp appends to it.
# This leaves a string which can be split in order to iterate over it.
process_dirs="${sftp_dirs/'Changing to: /IN sftp> ls '/}"

# Now iterate over each directory and retrieve the files.
for _dir in $(echo $process_dirs | tr " " "\n")
do
     # Fill in Step2
done

Шаг 2. Получение всех файлов и дат их создания

Временные метки создания файлов на SFTP-сервере — это даты, когда я отправил файлы на сервер. Таким образом, получение файлов, хранящихся на сервере более 7 дней, можно определить по времени их создания.

Задача здесь состоит в том, чтобы получить эту информацию из эхо-вывода SFTP с тех пор. Поскольку у меня есть все необходимые права для установки всего, что мне нужно, на сервер, на котором выполняется CRON-задание, я использовал для этого помощь LFTP, так как я не мог сделать это с чистым SFTP.

Наконец, решение состоит в том, чтобы прочитать массив из вывода LFTP.

# Returns an array with all files stored in $_dir with their respective timestamps.
# $_dir is the loop-variable from Step 1
readarray -t _files <<< "$(lftp -u $username, sftp://$sftp_server:/IN/$_dir -e "cls -B --date --time-style long-iso; exit")"

Обратите внимание, что я установил метку времени на long-iso для дальнейшей обработки.

Таким образом, теперь перебираем все файлы, чтобы определить те, которые старше 7 дней, например:

for _file in "${_files[@]}"
do
    # Fill in Step3
done

Шаг 3. Получите и удалите старые файлы

Вот прямо вперед код:

# Get the files date in the desired date format
# (remember that long-iso was chosen in Step 2)
# _file is the loop-variable from Step 2
_file_date=$(date -d "${_file:0:10}" +%s)
_file_name="/IN/"$_dir"/"${_file:17}

# Compare the date-difference
deletion_date=$(date -d 'now - 7 days' +%s)
_datediff=$(( (_file_date - deletion_date) / 86400 ))

Наконец, если результаты datediffs показывают, что файл старше 7 дней, удалите его.

if [ $_datediff -lt 0 ]
then
    # Pass the file to sftp and issue the delete command.
    echo "rm $_file_name" | sftp $username@$sftp_server
fi
13.04.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..