Завантаження декількох файлів через 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

тому що я не завжди знаю імена файлів txt у поточній папці або кількість файлів, які потрібно перенести.

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

Я раніше не займався сценарієм "башти" - це найпростіший спосіб досягти цього?

Відповіді:


20

Ваша перша команда повинна працювати без пробілів:

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

Також зверніть увагу на проміжки "/" у вказаних вище URL-адресах.

Це ручний запис щодо параметра "-T":

-T, --завантажте файл

Це передає вказаний локальний файл у віддалену URL-адресу. Якщо у вказаній URL-адресі немає частини файлу, Curl додасть ім'я локального файлу. Зверніть увагу, що ви повинні використовувати трейлінг / в останньому каталозі, щоб дійсно довести Curl, що немає імені файлу або curl подумає, що ваше останнє ім'я каталогу - це віддалене ім'я файлу, яке слід використовувати. Це, швидше за все, спричинить збій операції завантаження. Якщо це використовується на сервері HTTP (S), буде використана команда PUT.

Використовуйте ім'я файлу "-" (один тире), щоб використовувати stdin замість даного файлу. Крім того, ім'я файлу "." (один період) може бути вказаний замість "-", щоб використовувати stdin в режимі, що не блокує, щоб дозволити вихід сервера зчитування під час завантаження stdin.

Ви можете вказати один -T для кожної URL-адреси в командному рядку. Кожна пара URL -T + вказує, що потрібно завантажити та куди. curl також підтримує "глобалізацію" аргументу -T, тобто означає, що ви можете завантажувати декілька файлів до однієї 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 evidence1-100 снимки.txt

ftp://ftp.numericals.com/file evidence001-100 снимки.txt (з провідними нулями)

ftp://ftp.letters.com/file evidenceazSense.txt

[...]

Коли ви використовуєте послідовності [] або {} при виклику з командного рядка, вам, ймовірно, доведеться вводити повну URL-адресу в подвійні лапки, щоб оболонка не заважала їй. Це стосується й інших персонажів, до яких звертаються спеціально, як-от "&", "?" і '*'.

Але ви можете використовувати "звичайну" оболонку так, як це:

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

(Останній приклад може працювати не у всіх оболонках або з будь-якими видами екзотичних файлів.)


$(perl -e 'print join(",",@ARGV)' *.txt)буде правильно обробляти імена файлів з пробілами.
ivan_pozdeev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.