Загрузка нескольких файлов через FTP с помощью curl

14

Я пытаюсь загрузить все текстовые файлы в текущей папке через FTP на сервер, используя curl. Я попробовал следующую строку:

 curl -T "{file1.txt, file2.txt}" ftp://XXX --user YYY

где XXX - IP-адрес сервера, а YYY - имя пользователя и пароль.

Я могу успешно передать file1.txt на сервер, но он жалуется на второй файл, говорящий «Не могу открыть» имя_файла »!

Я поменял имена файлов, и это сработало для file2.txt, а не для file1.txt. Кажется, я неправильно понял синтаксис, но это то, что написано в руководстве?

Кроме того, в идеале я мог бы сделать что-то вроде этого:

 curl -T *.txt ftp://XXX --user YYY

потому что я не всегда буду знать имена текстовых файлов в текущей папке или количество файлов для передачи.

Я придерживаюсь мнения, что мне, возможно, придется написать скрипт bash, который собирает выходные данные ls *.txtв массив и помещает его в формат нескольких файлов, требуемый curl.

Раньше я не занимался сценариями bash - это самый простой способ добиться этого?

JJT
источник

Ответы:

20

Ваша первая команда должна работать без пробелов:

curl -T "{file1.txt,file2.txt}" ftp://XXX/ -user YYY

Также обратите внимание на завершающий символ "/" в приведенных выше URL.

Это ручная запись curl о опции "-T":

-T, --upload-файл

Это передает указанный локальный файл на удаленный URL. Если в указанном URL нет файловой части, Curl добавит локальное имя файла. Обратите внимание, что вы должны использовать конечный / последний каталог, чтобы действительно доказать Curl, что имя файла отсутствует, или curl подумает, что ваше последнее имя каталога - это имя удаленного файла для использования. Это, скорее всего, приведет к сбою операции загрузки. Если это используется на сервере HTTP (S), будет использоваться команда PUT.

Используйте имя файла «-» (одна черта), чтобы использовать стандартный ввод вместо заданного файла. Альтернативно, имя файла "." (один период) может быть указан вместо «-» для использования stdin в неблокирующем режиме, чтобы разрешить чтение вывода с сервера во время загрузки stdin.

Вы можете указать один -T для каждого URL в командной строке. Каждая пара -T + URL указывает, что загружать и куда. curl также поддерживает «подстановку» аргумента -T, что означает, что вы можете загрузить несколько файлов на один URL-адрес, используя тот же стиль подстановки URL-адреса, поддерживаемый в URL-адресе, например:

curl -T "{file1,file2}" http://www.uploadtothissite.com

или даже

curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/

Расширение "* .txt" не работает, потому что curl поддерживает только тот же синтаксис, что и для URL:

Вы можете указать несколько URL или частей URL, написав наборы деталей в фигурных скобках, как показано в:

http: // site . {один, два, три} .com

или вы можете получить последовательности буквенно-цифровых серий, используя [] как в:

ftp://ftp.numericals.com/file[1-100].txt

ftp://ftp.numerics.com/file[001-100].txt (с ведущими нулями)

ftp://ftp.letters.com/file[az].txt

[...]

При использовании последовательностей [] или {} при вызове из командной строки вы, вероятно, должны указывать полный URL-адрес в двойных кавычках, чтобы избежать вмешательства оболочки. Это также относится и к другим символам, которые рассматриваются как специальные, например, '&', '?' и '*'.

Но вы можете использовать «нормальную» оболочку, вот так:

curl -T "{$(echo *.txt | tr ' ' ',')}" ftp://XXX/ -user YYY

(Последний пример может не работать во всех оболочках или с любыми экзотическими именами файлов.)

rudimeier
источник
$(perl -e 'print join(",",@ARGV)' *.txt)будет правильно обрабатывать имена файлов с пробелами.
ivan_pozdeev