У меня два сервера:
Я хочу, чтобы каждый раз, когда файл загружается на сервер A, в любую подпапку в / files, файл автоматически копируется в ту же подпапку на сервере B. Таким образом, если пользователь загружает «flowers.jpg» в / files / photos / 12345 / тогда файл нужно скопировать по FTP в C: \ content \ photos \ 12345
Пока у меня есть этот сценарий bash, он копирует файлы на сервер B, но все файлы помещаются в C: \ content, а не в соответствующие подпапки. Кто может помочь мне найти правильный синтаксис?
#!/bin/bash
cd /files
inotifywait -q -r -m -e close_write,moved_to . --format %w%f |
while read FILE; do
lftp -e "put $FILE; exit" -u user,password -p 2121 ftp.server-a.com
done
Это потому, что команда FTP put $FILE
поместит файл $FILE
в любой «текущий каталог» на стороне FTP-сервера; следовательно, в корневой каталог FTP-сервера (который находится в C: \ content).
Вам нужно сначала извлечь подкаталог из inotifywait
с %w
вывод, затем добавьте cd
FTP-команду для lftp
параметр.
Я никогда не использовал inotifywait
раньше, но я думаю, что сценарий должен быть таким:
inotifywait -q -r -m -e close_write,moved_to . --format "%w %f" |
while read DIR FILE; do
lftp -e "cd $DIR; put $FILE; exit" -u user,password -p 2121 ftp.server-a.com
done
PS: Никогда не стоит явно писать пароль в сценарии. Использовать rsync
вместо; в Windows вам потребуется установить rsync
сервер. Я лично использую Cygwin и использую cygrunsrv
делать rsync
запустить как службу Windows.
@pepoluan дал мне ответ, но я хотел проинформировать о сценарии, который у меня получился, который немного отличается (причина, по которой я сделал это в ответе, а не в комментарии: вы не можете разметить код в комментарии)
#!/bin/bash
cd /files
inotifywait -q -r -m -e close_write,moved_to . --format "%w %w%f" |
while read DIR FILE; do
lftp -e "mkdir -p $DIR; cd $DIR; put $FILE; exit" -u user,pass -p 2121 ftp.server-a.com
done