BASH рекурсивный поиск имени файла и копирование на ftp

Я работаю над сценарием Bash (см. ниже), который рекурсивно просматривает каталоги в SAN для файлов с определенным именем файла, которое старше 4 часов. Затем скопируйте все эти файлы в определенное местоположение FTP и отправьте электронное письмо, чтобы сказать, что копирование было завершено. Сценарий работает нормально, за исключением того, что он копирует файлы только в каталог верхнего уровня. Ошибка, которую я получаю в нижних каталогах, заключается в следующем:

#
remote: -v
ftp: local: -v: No such file or directory
local: ./Test01/test02/folder02_01_1200_m30.mp4 remote: ./Test01/test02/folder02_01_1200_m30.mp4
229 Entering Extended Passive Mode (|||45127|)
550 ./Test01/test02/folder02_01_1200_m30.mp4: File does not exist. (2)
221 Goodbye.
#

Вот сценарий

#!/bin/bash
#The location from where the script should search
GSPORIGIN='/Volumes/folder01/folder02'

#File Names to be moved
FILE1='*1200_m30.mp4'

#FTP Details
HOST='xxxx.upload.com'
USER='xxxxxxx'
PASSWD='xxxxxxxxxxxx'
#the destination directory on the FTP
DESTDIR="/8619/_!/TEST"


# Go to the location from where the search should start 
cd $GSPORIGIN
for file in `find . -type f -name "*1200_m30.mp4" -mmin -240`
do 
echo $file
if [ -f $file ] ; then
ftp -n -v $HOST << EOT
ascii
user $USER $PASSWD
prompt
cd $DESTDIR
mput -v $file
EOT
echo "$file has been copied to FTP" | mail -s "$file has been copied to FTP in Directory $DESTDIR"  [email protected]; 
else exit 1
fi
done

person JRM    schedule 22.06.2011    source источник


Ответы (2)


Чтобы сделать то, что вы делаете, вам придется заново создать каталоги на целевом FTP. используйте команды basename/dirname и команду mkdir следующим образом:

for file in `find . -type f -name "*1200_m30.mp4" -mmin -240`
do 
echo $file
if [ -f $file ] ; then

destdirname=`dirname "$file"`

ftp -n -v $HOST << EOT
ascii
user $USER $PASSWD
prompt
cd $DESTDIR
mkdir $destdirname 
mput -v $file
EOT
echo "$file has been copied to FTP" | mail -s "$file has been copied to FTP in Directory $DESTDIR"  [email protected]; 
else exit 1
fi
person Cédric Julien    schedule 22.06.2011
comment
Спасибо за быстрый ответ - во-первых, когда я запускаю скрипт, он создает каталоги, но не может перемещать файлы: ./Test_1200_m30.mp4 Пытаюсь 96.7.36.11... Подключен к ftp.xxxxxxxxx.net. 220 Хранилище содержимого FTP-сервер 530 Пожалуйста, войдите в систему с ПОЛЬЗОВАТЕЛЕМ и ПАРОЛЕМ 331 Требуется пароль для XXXXX. 230 Пользователь stor_admin вошел в систему. Тип удаленной системы — UNIX. Использование бинарного режима для передачи файлов. Интерактивный режим выключен. 250 Команда CWD выполнена успешно. 550 .: Запрещенное имя файла (4) 250 Команда CWD выполнена успешно. использование: поместите локальный файл [удаленный файл] 221 До свидания. ./Test_1200_m30.mp4 - person JRM; 23.06.2011
comment
Исправление: mput -v $file $filename - person JRM; 23.06.2011
comment
@JRM: хорошо, я не был уверен в синтаксисе mput, я редактирую свой ответ. - person Cédric Julien; 23.06.2011
comment
Спасибо - только что попробовал ваше предложение удалить cd $destdirname, и это работает - в любом случае, спасибо, это работает! - person JRM; 23.06.2011

Чтобы скопировать несколько файлов во вложенные каталоги: я бы посоветовал вам взглянуть на rsync утилита, которая сделает эту работу за вас.

rsync будет создавать все удаленные каталоги, когда это необходимо, и будет поддерживать полную синхронизацию файлов даже после частых запусков.

person anubhava    schedule 22.06.2011