На одном проекте мне понадобилось отправлять все текущие, а затем только новые файлы из определенного раздела на сторонний FTP-сервер. Для решения этой задачи я воспользовался следующим bash-скриптом:
#!/bin/bash # Папка, где хранятся файлы LOCAL_DIR="./local_files" # FTP-сервер FTP_SERVER="ftp.example.com" # Папка на FTP-сервере FTP_REMOTE_DIR="/ftp/path/to/folder" # Файл, который уже отправлен SEND_FILE_FLAG="send_flag.txt" # Проверяем, существует ли файл с флагом отправки if [ ! -f "$SEND_FILE_FLAG" ]; then touch "$SEND_FILE_FLAG" # Создаем файл с флагом отправки, если его нет fi # Перебираем файлы в папке for file in $(find "$LOCAL_DIR" -type f -not -path "$SEND_FILE_FLAG" -printf "%f\n"); do # Получаем путь к файлу FULL_PATH="$LOCAL_DIR/$file" # Проверяем, отправлен ли уже файл if grep -q "$FULL_PATH" "$SEND_FILE_FLAG"; then echo "Файл $FULL_PATH уже отправлен" continue fi # Отправляем файл по FTP echo "Отправляем файл $FULL_PATH" curl -u "username:password" --upload-file "$FULL_PATH" "ftp://$FTP_SERVER/$FTP_REMOTE_DIR/$file" # Замените username и password #curl -u "username:password" --upload-file "$FULL_PATH" "ftp://ftp.example.com/path/to/folder/$file" # Пример с полным путем # Добавляем отправленный файл в список echo "$FULL_PATH" >> "$SEND_FILE_FLAG" done echo "Обработка завершена"
после правки скрипта я назвал его sendftp.sh и дал права этому скрипту на выполнение. Проверил работу скрипта:
bash sendftp.sh
У меня скрипт нормально отправил файлы на FTP-сервер.
Сделал запуск скрипта каждые 10 минут в crontab:
crontab -e
Нужно обратить внимание, что crontab -l нужно запускать от имени того пользователя, который необходим. Можно, конечно, и от пользователя root запустить.
В crontab сделал следующую запись:
*/10 * * * * /home/exchange/sendftp.sh
где /home/exchange/sendftp.sh — это путь до bash-скрипта
При работе скрипта создается файл send_flag.txt, куда записываются успешно отправленные файлы. Если новый файл, который ещё не был отправлен на FTP-сервер, отсутствует в этом списке, то он отправится скриптом. Если название файла уже присутствует в списке, то этот файл не отправляется. Если удалить файл send_flag.txt, то отправятся все файлы из выбранного раздела и файл send_flag.txt создастся снова.